EOF 的功能问题
Function trouble with EOF
我有一个函数应该逐个字符地读取文件并输出到控制台,直到它到达 EOF。该功能可以很好地显示我想要的所有字符,但它会继续运行,并且永远不会在最后停止。
下面是函数
void displayAllLines(ifstream &joke)
{
char ch;
joke.clear();
ch = joke.get();
while (ch != EOF)
{
cout << ch;
ch = joke.get();
}
}
下面列出的文件的内容
”(空行)
问:舌头对牙齿说了什么?
正如我所说,它显示该行很好,但在问号之后循环继续。
想知道为什么会这样吗?另外,是否需要更多信息才能正确回答我的问题?
规范的做法是:
void displayAllLines(ifstream &joke)
{
char ch;
while (true)
{
ch = joke.get();
if (joke) {
cout << ch;
} else {
break;
}
}
}
表达式 joke
的计算结果为真,直到遇到 EOF。我不确定您为什么要先致电 joke.clear()
。
@Phil 回答了 "how to do this in C++"。我的答案进入 "why is this happening" 和 "how to do this in C"(它仍然适用于 C++)。
由于 ASCII table 从 1 一直向上,我们有字节值 0 ('[=13=]'
) 保留用于字符串终止 (谈论 C 和 C++ 语言), EOF需要是它之外的一个特殊值。
这就是为什么 getchar()
和 ifstream::get()
return 一个 int
,而不是 char
。所以你需要做的就是改变
char ch;
到
int ch;
并将其转换为 char 以进行打印:
cout << (char) ch;
从技术上讲,EOF 通常是 -1
。您的 char
的范围可能是 0 - 255
,这意味着它永远不会等于 -1
。启用了 -Wall
的体面的编译器应该至少给你一个警告。
我有一个函数应该逐个字符地读取文件并输出到控制台,直到它到达 EOF。该功能可以很好地显示我想要的所有字符,但它会继续运行,并且永远不会在最后停止。
下面是函数
void displayAllLines(ifstream &joke)
{
char ch;
joke.clear();
ch = joke.get();
while (ch != EOF)
{
cout << ch;
ch = joke.get();
}
}
下面列出的文件的内容
”(空行) 问:舌头对牙齿说了什么?
正如我所说,它显示该行很好,但在问号之后循环继续。
想知道为什么会这样吗?另外,是否需要更多信息才能正确回答我的问题?
规范的做法是:
void displayAllLines(ifstream &joke)
{
char ch;
while (true)
{
ch = joke.get();
if (joke) {
cout << ch;
} else {
break;
}
}
}
表达式 joke
的计算结果为真,直到遇到 EOF。我不确定您为什么要先致电 joke.clear()
。
@Phil 回答了 "how to do this in C++"。我的答案进入 "why is this happening" 和 "how to do this in C"(它仍然适用于 C++)。
由于 ASCII table 从 1 一直向上,我们有字节值 0 ('[=13=]'
) 保留用于字符串终止 (谈论 C 和 C++ 语言), EOF需要是它之外的一个特殊值。
这就是为什么 getchar()
和 ifstream::get()
return 一个 int
,而不是 char
。所以你需要做的就是改变
char ch;
到
int ch;
并将其转换为 char 以进行打印:
cout << (char) ch;
从技术上讲,EOF 通常是 -1
。您的 char
的范围可能是 0 - 255
,这意味着它永远不会等于 -1
。启用了 -Wall
的体面的编译器应该至少给你一个警告。