提问人:Chris_45 提问时间:11/23/2009 最后编辑:UndoChris_45 更新时间:6/19/2019 访问量:207499
C 编程语言中的 EOF 是什么?
What is EOF in the C programming language?
问:
你怎么能看到最后的印刷品?换句话说,EOF要放什么?我检查了定义,它说EOF是-1。
如果你输入Ctrl-D,你不会看到任何东西。
#include <stdio.h>
int main() {
int c;
while((c = getchar() != EOF)) {
printf("%d\n", c);
}
printf("%d - at EOF\n", c);
}
答:
EOF 表示文件结束。这表明已到达文件末尾,并且将不再有数据。
编辑:
我纠正了。在这种情况下,它不是文件的结束。如前所述,当 CTRL+d (linux) 或 CTRL+z (windows) 被传递时,它会被传递。
评论
getchar
EOF 的值是一个负整数,以区别于 0 到 255 范围内的“char”值。它通常是 -1,但它可能是任何其他负数......根据 POSIX 规范,因此您不应假设它是 -1。
^D 字符是在 UNIX/Linux 上的控制台流中键入的字符,用于告诉它在逻辑上结束输入流。但在其他上下文中(例如,当您从文件中读取时),它只是另一个数据字符。无论哪种方式,^D 字符(表示输入的结尾)都不会出现在应用程序代码中。
正如 @Bastien 所说,如果失败,也会返回 EOF。严格来说,您应该调用 或 查看 EOF 是否表示错误或流结束。但在大多数情况下,无论哪种情况,您的应用程序都会执行相同的操作。getchar()
ferror
feof
评论
在 Linux 系统和 OS X 上,要输入以导致 EOF 的字符为 -。对于 Windows,它是 -。CtrlDCtrlZ
根据操作系统的不同,此字符仅在它是一行上的第一个字符(即 .由于控制台输入通常是面向行的,因此系统也可能无法识别 EOF 字符,直到您使用 .EnterEnter
是的,如果该字符被识别为 EOF,那么您的程序将永远不会看到实际字符。相反,C 程序将从 .-1
getchar()
评论
您应该将括号改为
while((c = getchar()) != EOF)
因为“=”运算符的优先级低于“!=”运算符。然后你会得到预期的结果。您的表达式等于
while (c = (getchar()!= EOF))
你得到两个 1 作为输出,因为你正在进行比较“c!=EOF”。对于您输入的字符,这将始终成为 1,然后是按回车键后面的“\n”。除了最后一个比较,其中 c 确实是 EOF,它会给你一个 0。
关于EOF的编辑:EOF通常为-1,但标准不保证这一点。该标准仅在第 7.19.1 节中定义了 EOF:
EOF 扩展为整数 常量表达式,类型为 int 和 负值,由 几个功能来指示 文件末尾,即不再输入 从溪流;
假设 EOF 等于 -1 是合理的,但在使用 EOF 时,不应针对特定值进行测试,而应使用宏。
评论
Int
#define EOF (-1)
getchar
几个错别字:
while((c = getchar())!= EOF)
代替:
while((c = getchar() != EOF))
此外,getchar() 将返回键视为有效输入,因此您也需要对其进行缓冲。EOF 是指示输入结束的标记。通常,它是设置了所有位的 int。
#include <stdio.h>
int main()
{
int c;
while((c = getchar())!= EOF)
{
if( getchar() == EOF )
break;
printf(" %d\n", c);
}
printf("%d %u %x- at EOF\n", c , c, c);
}
指纹:
49 50 -1 4294967295 ffffffff- at EOF
对于输入:
1 2 <ctrl-d>
评论
getchar()
#include <stdio.h>
int main() {
int c;
while((c = getchar()) != EOF) { //precedence of != is greater than =, so use braces
printf("%d\n", c);
}
printf("%d - at EOF\n", c);
}
我认为这是检查EOF值的正确方法。 我检查了输出。
对于 INPUT: abc 和 Enter,我得到了 OUTPUT: 97 98 99 10。( ASCII 值)
对于 INPUT Ctrl-D,我在 EOF 处得到了 OUTPUT: -1 -。 所以我认为 -1 是 EOF 的值。
尝试使用其他输入而不是 Ctrl-D,例如 Ctrl-Z。 我认为它因编译器而异。
评论
stdio.h
EOF
-1
来自终端的 nput 永远不会真正“结束”(除非设备已断开连接),但在终端中输入多个“文件”很有用,因此保留一个键序列来指示输入结束。在 UNIX 中,击键到 EOF 的转换由终端驱动程序执行,因此程序不需要将终端与其他输入文件区分开来。默认情况下,驱动程序将行首的 Control-D 字符转换为文件结束指示符。若要将实际的 Control-D (ASCII 04) 字符插入到输入流中,用户需要在其前面加上一个“引号”命令字符(通常为 Control-V)。AmigaDOS 与此类似,但使用 Control-\ 而不是 Control-D。
在 Microsoft 的 DOS 和 Windows(以及 CP/M 和许多 DEC 操作系统)中,从终端读取永远不会产生 EOF。取而代之的是,程序识别源是终端(或其他“字符设备”),并将给定的保留字符或序列解释为文件结束指示符;最常见的是 ASCII Control-Z,代码 26。某些 MS-DOS 程序(包括Microsoft MS-DOS shell (COMMAND.COM) 和操作系统实用程序(如 EDLIN)的一部分)将文本文件中的 Control-Z 视为标记有意义数据的末尾,和/或在写入文本文件时将 Control-Z 追加到末尾。这样做有两个原因:
向后兼容 CP/M。CP/M 文件系统仅以 128 字节“记录”的倍数记录文件的长度,因此按照惯例,如果有意义数据在记录中间结束,则使用 Control-Z 字符来标记该数据的结尾。MS-DOS 文件系统始终记录文件的确切字节长度,因此在 MS-DOS 上从不需要这样做。
它允许程序使用相同的代码从终端和文本文件读取输入。
#include <stdio.h>
int main() {
int c;
while((c = getchar()) != EOF) {
putchar(c);
}
printf("%d at EOF\n", c);
}
修改了上面的代码以更清楚地了解 EOF,按 Ctrl+d 和 putchar 用于打印字符,避免在 while 循环中使用 printf。
评论
int c;
while((c = getchar())!= 10)
{
if( getchar() == EOF )
break;
printf(" %d\n", c);
}
评论
简单起见:EOF 是值为 -1 的整数类型。因此,我们必须使用整数变量来测试 EOF。
评论