如何在C++中使用std :: getline()?

时间:2020-02-23 14:29:58  来源:igfitidea点击:

在本文中,我们将介绍如何在C++中使用函数std :: getline()。
如果您想从输入流中读取字符,这是一个非常方便的功能。

让我们通过一些说明性示例来找出如何正确使用它。

C++中std :: getline()的基本语法

此函数从输入流中读取字符,并将其放入字符串中。

我们需要导入头文件" <string>",因为" getline()"是该文件的一部分。

尽管这需要模板参数,但我们将重点介绍字符串输入(字符),因为输出已写入字符串。

istream& getline(istream&amp; 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