繁体   English   中英

getline()读取额外的一行

[英]getline() reads an extra line

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总是读取额外的一行。

您在编写此代码时的代码:

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失败时,您仍然会增加行计数器并输出(不存在)行。

始终检查错误。

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

干杯和健康。

仅当file.good()为true时才执行cout 您看到的额外行来自对file.getline()的最后一次调用,该调用读取了文件末尾的内容。

问题是,当你在文件上的测试结束file仍然会成功,因为你还没有读取文件的末尾。 因此,您还需要测试getline()的返回值。

由于您需要测试getline()的返回值是否成功,因此您最好将它放在while循环中:

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

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

这将解决您的问题:

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";
  } 
}

它更强大

文件是否以换行符结尾? 如果确实如此,则只有经过一个额外的循环后,才会触发EOF标志。 例如,如果文件是

abc\n
def\n

然后循环将运行3次,第一次将获得abc ,第二次将获得def ,第三次将什么也没有。 这可能就是为什么您看到另外一行。

尝试在getline之后检查流上的故障位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM