如何在C++中使用std :: getline()?
在本文中,我们将介绍如何在C++中使用函数std :: getline()。
如果您想从输入流中读取字符,这是一个非常方便的功能。
让我们通过一些说明性示例来找出如何正确使用它。
C++中std :: getline()的基本语法
此函数从输入流中读取字符,并将其放入字符串中。
我们需要导入头文件" <string>",因为" getline()"是该文件的一部分。
尽管这需要模板参数,但我们将重点介绍字符串输入(字符),因为输出已写入字符串。
istream& getline(istream& input_stream, string& output, char delim);
这就是说" getline()"接收输入流,并将其写入"输出"。
可以使用delim指定分隔符。
这也会返回对相同输入流的引用,但是在大多数情况下,我们不需要此句柄。
使用std :: getline()从输入流中读取
现在我们已经了解了基本语法,让我们从" std :: cin"(标准输入流)到字符串的输入中获取。
#include <iostream>
#include <string>
int main() {
//Define a name (String)
std::string name;
std::cout << "Enter the name: ";
//Get the input from std::cin and store into name
std::getline(std::cin, name);
std::cout << "Hello " << name << "!\n";
return 0;
}
输出
Enter the name: theitroad Hello theitroad!
确实,我们能够从std :: cin那里获得输入,而没有任何问题!
现在再举一个例子,我们有一个文件" input.txt",其中包含以下内容:
$cat input.txt Hello from theitroad Second Line of file Last line
现在,我们逐行读取文件并将其存储在字符串向量中!
核心逻辑将是继续使用std :: getline(file)进行读取,直到输入流到达EOF。
我们可以使用以下格式轻松编写此代码:
std::ifstream infile("input.txt");
//Temporary buffer
std::string temp;
//Get the input from the input file until EOF
while (std::getline(infile, temp)) {
//Add to the list of output strings
outputs.push_back(temp);
}
完整的代码如下所示:
#include <iostream>
#include <string>
#include <vector> //For std::vector
#include <fstream> //For std::ifstream and std::ofstream
int main() {
//Store the contents into a vector of strings
std::vector<std::string> outputs;
std::cout << "Reading from input.txt....\n";
//Create the file object (input)
std::ifstream infile("input.txt");
//Temporary buffer
std::string temp;
//Get the input from the input file until EOF
while (std::getline(infile, temp)) {
//Add to the list of output strings
outputs.push_back(temp);
}
//Use a range-based for loop to iterate through the output vector
for (const auto& i : outputs)
std::cout << i << std::endl;
return 0;
}
输出
Reading from input.txt.... Hello from theitroad Second Line of file Last line
在C++中使用std :: getline()使用定界符分割输入
我们还可以使用delim参数来使getline函数根据分隔符来分割输入。
默认情况下,定界符为" \ n"(换行符)。
我们可以改变它,使getline()也基于其他字符分割输入!
让我们在上面的示例中将delim字符设置为空格"",然后看看会发生什么!
#include <iostream>
#include <string>
#include <vector> //For std::vector
#include <fstream> //For std::ifstream and std::ofstream
int main() {
//Store the contents into a vector of strings
std::vector<std::string> outputs;
std::cout << "Reading from input.txt....\n";
//Create the file object (input)
std::ifstream infile("input.txt");
//Temporary buffer
std::string temp;
//Get the input from the input file until EOF
while (std::getline(infile, temp, ' ')) {
//Add to the list of output strings
outputs.push_back(temp);
}
//Use a range-based for loop to iterate through the output vector
for (const auto& i : outputs)
std::cout << i << std::endl;
return 0;
}
输出
Reading from input.txt.... Hello from theitroad Second Line of file Last line
确实,我们现在有了用空格分隔的字符串!
使用std :: getline()的潜在问题
尽管std :: getline()是一个非常有用的函数,但在将其与诸如std :: cin之类的一些输入流一起使用时,可能会遇到一些问题。
std :: getline()不会忽略任何前导空格/换行符。
因此,如果在getline()之前调用std :: cin >> var;,则在读取输入变量后,输入流中仍将保留换行符。
因此,如果您在cin之后立即调用getline(),则会得到一个换行符,因为它是输入流中的第一个字符!
为了避免这种情况,只需添加一个虚拟std :: getline()来消耗这个换行符!
下面的程序显示了在getline()之前使用cin的问题。
#include <iostream>
#include <string>
int main() {
//Define a name (String)
std::string name;
int id;
std::cout << "Enter the id: ";
std::cin >> id;
std::cout << "Enter the Name: ";
//Notice std::cin was the last input call!
std::getline(std::cin, name);
std::cout << "Id: " << id << std::endl;
std::cout << "Name: " << name << "\n";
return 0;
}
输出
Enter the id: 10 Enter the Name: Id: 10 Name:
请注意,我根本无法输入姓名!由于输入流中存在尾随换行符,因此它就简单地采用了它,并且由于它是一个定界符,因此它停止读取!
现在,在实际的std :: getline()之前添加一个虚拟的std :: getline()调用。
#include <iostream>
#include <string>
int main() {
//Define a name (String)
std::string name;
int id;
std::cout << "Enter the id: ";
std::cin >> id;
std::cout << "Enter the Name: ";
//Add a dummy getline() call
std::getline(std::cin, name);
//Notice std::cin was the last input call!
std::getline(std::cin, name);
std::cout << "Id: " << id << std::endl;
std::cout << "Name: " << name << "\n";
return 0;
}
输出
Enter the id: 10 Enter the Name: theitroad Id: 10 Name: theitroad

