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总是读取额外的行。
答案 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
功能。
答案 1 :(得分:1)
如果cout
为真,则只执行file.good()
。您看到的额外行是来自file.getline()
的最后一次调用,该调用读取文件的末尾。
答案 2 :(得分:1)
问题是当你在文件末尾时,file
上的测试仍然会成功,因为你还没有读过文件末尾。所以你还需要测试getline()
的回报。
由于您需要测试getline()
的返回值以查看它是否成功,您也可以将其放在while循环中:
while (file.getline(line[l], 80))
cout << line[l++] << "\n";
这样,您就无需对file
和getline()
进行单独测试。
答案 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";
}
}
更强大