简单C++不读取EOF
Simple C++ not reading EOF
我很难理解为什么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,但进入int
或string
的最后>>
将带我们到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 bool
或operator 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
}
}
也就是说,可能有更好的方法来做你想做的事情
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- 而(!inputfile.eof())只读取第一行?
- 如何在 EOF 之前从文件中读取并将其放入字符串中?
- 如何在从文件中读取整数时使用 file.eof()?
- std::cin 在读取 EOF 并清除后不再读取
- 读取 c++ istream 直到 EOF,同时丢弃内容
- 使用 gzread 读取直到 EOF 并膨胀浮点值
- Fstream 在点击 EOF 时读取行为
- .EOF 在读取文件时导致 Seg 错误:FIXXED
- 输入文件读取错误的值,eof 控制循环不会结束
- C OOP,读取文件的问题,EOF使用了两次,排行榜
- 为什么Windows不能读取超过0x1A(EOF)字符,而Unix可以?
- C++和 eof 中的文件读取
- 简单C++不读取EOF
- 如果用户输入字符串,请在用户中读取 n和eof
- std :: getline部分读取第一行,并设置eof-bit
- 在读取C 文件时跳过EOF
- 输入 EOF 后,不能重复使用 cin 来读取值
- EOF 位:读取失败之前或之后
- 如何在 EOF (C++) 之前读取多个块中的文件