getline()读取一个额外的行

时间:2011-09-29 12:39:11

标签: c++ ifstream getline

ifstream file("file.txt");
 if(file.fail())
{
cout<<"Could not open the file";
exit(1);
}
else
{
      while(file)
      {
        file.getline(line[l],80); 
                          cout<<line[l++]<<"\n";
      } 
}

我正在使用二维字符数组来保持从文件中读取的文本(多行)来计算文件中的行数和单词数,但问题是getline总是读取额外的行。

5 个答案:

答案 0 :(得分:3)

我的代码正如我写的那样:

ifstream file("file.txt");
 if(file.fail())
{
cout<<"Could not open the file";
exit(1);
}
else
{
      while(file)
      {
        file.getline(line[l],80); 
        cout<<line[l++]<<"\n";
      } 
}

第一次getline失败时,您仍然会增加行计数器并输出(不存在的)行。

始终检查错误。

额外建议:使用std::string标头中的<string>,并使用其getline功能。

欢呼&amp;第h

答案 1 :(得分:1)

如果cout为真,则只执行file.good()。您看到的额外行是来自file.getline()的最后一次调用,该调用读取文件的末尾。

答案 2 :(得分:1)

问题是当你在文件末尾时,file上的测试仍然会成功,因为你还没有读过文件末尾。所以你还需要测试getline()的回报。

由于您需要测试getline()的返回值以查看它是否成功,您也可以将其放在while循环中:

while (file.getline(line[l], 80))
    cout << line[l++] << "\n";

这样,您就无需对filegetline()进行单独测试。

答案 3 :(得分:0)

文件是否以换行符结尾?如果是,则在一个额外的循环通过之前不会触发EOF标志。例如,如果文件是

abc\n
def\n

然后循环将运行3次,第一次将获得abc,第二次将获得def,第三次将获得任何内容。这可能就是为什么你会看到额外的一行。

尝试在getline之后检查流上的failbit。

答案 4 :(得分:0)

这将解决您的问题:

ifstream file("file.txt");
if(!file.good())
{
  cout<<"Could not open the file";
  exit(1);
}
else
{
  while(file)
  {
    file.getline(line[l],80);
       if(!file.eof())
          cout<<line[l++]<<"\n";
  } 
}

更强大