使用getline从文件中读取多行?

时间:2017-05-25 03:28:47

标签: c++ while-loop fstream getline

我正在尝试读取names.txt文件中的数据,并输出每个人的全名和理想体重。使用循环从文件中读取每个人的姓名和英尺。 该文件为:

Tom Atto 6 3 Eaton Wright 5 5 Cary Oki 5 11 Omar Ahmed 5 9

我正在使用以下代码:

string name;
int feet, extraInches, idealWeight;
ifstream inFile;

inFile.open ("names.txt");

while (getline(inFile,name))
{
    inFile >> feet;
    inFile >> extraInches;

    idealWeight = 110 + ((feet - 5) * 12 + extraInches) * 5;

    cout << "The ideal weight for " << name << " is " << idealWeight << "\n";

}
inFile.close();

当我运行这个即时输出时:

The ideal weight for Tom Atto is 185 The ideal weight for is -175

2 个答案:

答案 0 :(得分:1)

在读取两个extraInches值后,在while循环中添加此语句。

inFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

'\n'循环中读取的第二个整数后忽略while。您可以参考:Use getline and >> when read file C++

答案 1 :(得分:0)

你遇到了问题,因为在行

之后
inFile >> extraInches;

在循环的第一次迭代中执行,流中仍然有换行符。下一次调用getline只会返回一个空行。随后的电话

inFile >> feet;

失败,但您没有检查通话是否成功。

我想提及与您的问题相关的一些事情。

  1. 使用getline混合未格式化的输入,并使用operator>>格式化输入充满了问题。避免它。

  2. 要诊断与IO相关的问题,请务必在操作后检查流的状态。

  3. 在您的情况下,您可以使用getline读取文本行,然后使用istringstream从行中提取数字。

    while (getline(inFile,name))
    {
       std::string line;
    
       // Read a line of text to extract the feet
       if ( !(inFile >> line ) )
       {
          // Problem
          break;
       }
       else
       {
          std::istringstream str(line);
          if ( !(str >> feet) )
          {
             // Problem
             break;
          }
       }
    
       // Read a line of text to extract the inches
       if ( !(inFile >> line ) )
       {
          // Problem
          break;
       }
       else
       {
          std::istringstream str(line);
          if ( !(str >> inches) )
          {
             // Problem
             break;
          }
       }
    
        idealWeight = 110 + ((feet - 5) * 12 + extraInches) * 5;
    
        cout << "The ideal weight for " << name << " is " << idealWeight << "\n";
    
    }