这是交易,我有一个文本文件,其中包含一本书中的一些句子,我想阅读并计算其中的句子数。我找到的一种方法是计算文件中的点数。它工作正常,直到最后一个字符。当读数到达最后一个字符(这是一个点)时,它会添加另一个点,我会仔细检查文本文件,最后只有一个点。当我在阅读过程中打印每个字符时,我看到最后的第二个点。这是我的代码:
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
int main(void)
{
ifstream files("assommoir.txt");
char caractere;
int n = 0;
if (files.fail() == 0)
{
while (files.eof() == 0)
{
files >> caractere;
cout << caractere;
if (int(caractere) == 46)
n++;
}
cout << n << "\n";
}
else
cout << "reading problem detected" << endl;
}
答案 0 :(得分:4)
files.eof()
就是真的,而不是在你读完最后一个角色之后。因此,files.eof()
在最后一个字符后成功,但在执行files >> caractere
后会引发该标志。由于此时您不进行检查,caractere
未经修改(它仍然是一个点),您的程序会一直运行,直到它再次循环。
您应该使用while (files >> caractere)
,因为输入流可以转换为布尔值,表明它是否处于有效状态。
答案 1 :(得分:1)
只需使用while (files >> caractere)
。
while (files.eof() == 0)
已被破坏 - eof
只有在您尝试阅读不存在的内容后才会出现错误(考虑到调用eof()
时它不知道您会发生什么尝试阅读下一个 - 可能是下一个非空白字符或任何单个字符或数字 - 对于某些类型的数据和空白跳过行为eof()
将被击中而其他人不会被击中。