我有一个函数应该通过char读取文件char并输出到控制台,直到它达到EOF。该功能可以很好地显示我想要的所有字符,但它只是继续前进,并且永远不会停止在最后。
以下是功能
void displayAllLines(ifstream &joke)
{
char ch;
joke.clear();
ch = joke.get();
while (ch != EOF)
{
cout << ch;
ch = joke.get();
}
}
下面列出的文件的内容
&#34;(空白行) 问:舌头对牙齿说了什么?&#34;
正如我所说,它显示的线条很好,但循环继续在问号后面。
有关为何会这样做的任何想法?此外,是否需要更多信息才能正确回答我的问题?
答案 0 :(得分:1)
这样做的规范方法是:
void displayAllLines(ifstream &joke)
{
char ch;
while (true)
{
ch = joke.get();
if (joke) {
cout << ch;
} else {
break;
}
}
}
表达式joke
将评估为真,直到它达到EOF。我不确定您为什么要首先致电joke.clear()
。
答案 1 :(得分:1)
@Phil回答&#34;如何在C ++中做到这一点&#34;。我的回答是&#34;为什么会发生这种情况&#34;和&#34;如何在C&#34; (它仍然适用于C ++)。
由于ASCII表一直从1开始,我们有字节值0('\0'
)保留用于字符串终止(谈论C和C ++语言),因此EOF需要是一个特殊的价值。
这就是getchar()
和ifstream::get()
返回int
而不是char
的原因。所以你需要做的就是改变
char ch;
到
int ch;
并将其转换为char进行打印:
cout << (char) ch;
从技术上讲,EOF通常为-1
。您的char
可能有0 - 255
范围,这意味着它永远不会等于-1
。启用-Wall
的合适编译器应该至少给你一个警告。