[英]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";
这样,您就不需要对file
和getline()
进行单独的测试。
这将解决您的问题:
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.