如何在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