简单C++不读取EOF

Simple C++ not reading EOF

本文关键字:EOF 读取 C++ 简单      更新时间:2023-10-16

我很难理解为什么while (cin.get(Ch))看不到EOF。我在一个有3个单词的文本文件中阅读,当我调试时,我的WordCount为3(这正是我所希望的)。然后它又回到while循环并被卡住。则CCD_ 3没有值。我以为在换行之后,它会读取EOF并爆发。我不允许使用<fstream>,我必须在DOS中使用重定向。非常感谢。

#include <iostream>
using namespace std;
int main()
{
char Ch = ' ';
int WordCount = 0;
int LetterCount = 0;
cout << "(Reading file...)" << endl;
while (cin.get(Ch))
{
if ((Ch == 'n') || (Ch == ' '))
{
++WordCount;
LetterCount = 0;
}
else
++LetterCount;
}
cout << "Number of words => " << WordCount << endl;
return 0;
}
while (cin >> Ch)
{   // we get in here if, and only if, the >> was successful
if ((Ch == 'n') || (Ch == ' '))
{
++WordCount;
LetterCount = 0;
}
else
++LetterCount;
}

这是一种安全、通用的方法,可以安全地重写代码,并且只需进行最少的更改。

(你的代码很不寻常,试图扫描所有字符并计算空白和换行符。我会对一个稍微不同的问题给出一个更一般的答案——如何阅读所有单词。)

如果if(stream)。小心if(stream.good())——它并不总是像预期的那样工作,有时会过早退出。进入char的最后一个>>不会将我们带到EOF,但进入intstring的最后>>将带我们到EOF。这种不一致性可能令人困惑。因此,使用good()或任何其他测试EOF的测试都是不正确的。

string word;
while(cin >> word) {
++word_count;
}

CCD_ 14和CCD_。前者是operator bool转换。通常,在这种情况下,您需要测试:

"上次提取操作成功还是失败?">

这与不同

"我们现在在EOF吗?">

cin >> word读取最后一个字后,字符串处于EOF。但是word仍然有效并且包含最后一个单词。

TLDR:eof位并不重要。bad位为。这告诉我们上次提取失败。

计数

程序将换行符和空格字符计算为单词。在你的文件内容"这很有趣!"我看到两个空格,没有换行符。这与观察到的指示两个单词的输出一致。

你有没有试过用十六进制编辑器或类似的东西查看你的文件,以确定确切的内容?

如果循环中读取的最后一个字符是一个字母,您也可以更改程序以再计算一个单词。这样,您就不必有换行的输入文件。

回路终端

我无法解释您的循环终止问题。while条件对我来说很好。istream::get(char&)返回一个流引用。在while条件下,根据编译器实现的C++级别,operator booloperator void*将应用于引用,以指示是否可以进一步读取。

习语

从流中读取的标准习惯用法是

char c = 0;
while( cin >> c )
process(c);

我不会在没有严重理由的情况下偏离它。

您输入的文件是

这很有趣!{EOF}

两个空格使WordCount增加到2然后EOF,退出循环!如果添加新行,则输入文件为

this is fun!n{EOF}

我把你的程序加载到visual studio 2013,把cin改为一个fstream对象,打开了一个名为stuff.txt的文件,其中包含确切的字符"这很有趣!/n/r",程序就工作了。正如前面的答案所示,要小心,因为如果文本末尾没有a/n,程序将错过最后一个单词。然而,我无法复制挂在无限循环中的应用程序。写的代码在我看来是正确的。

cin.get(char)返回对istream对象的引用,然后调用它的运算符bool(),当设置任何错误位时,该运算符返回false。有一些更好的方法可以编写此代码来处理其他错误情况。。。但这个代码对我有效。

在您的情况下,跳出循环的正确方法是:

while (cin.good()) {
char Ch = cin.get();
if (cin.good()) {
// do something with Ch
}
}

也就是说,可能有更好的方法来做你想做的事情