什么是C编程语言中的EOF?

时间:2009-11-23 09:39:59

标签: c input eof

你如何看到最后一张照片?换句话说,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);
}

10 个答案:

答案 0 :(得分:44)

在Linux系统和OS X上,输入以导致EOF的字符是 Ctrl - D 。对于Windows,它是 Ctrl - Z

根据操作系统的不同,此字符只有在一行中的第一个字符即 Enter 后的第一个字符时才有效。由于控制台输入通常是面向行的,因此系统可能无法识别EOF字符,直到您使用 Enter 跟进它。

是的,如果该角色被识别为EOF,那么您的程序将永远不会看到实际的角色。相反,C程序将从-1获得getchar()

答案 1 :(得分:27)

您应该将括号更改为

while((c = getchar()) != EOF)

因为“=”运算符的优先级低于“!=”运算符。然后你会得到预期的结果。你的表达式等于

while (c = (getchar()!= EOF))

你得到两个1作为输出,因为你正在进行比较“c!= EOF”。这将始终成为您输入的字符的一个,然后通过点击返回后面的“\ n”。除了最后的比较,其中c确实是EOF,它会给你一个0。

关于EOF的编辑:EOF通常为-1,但标准不保证这一点。该标准仅在7.19.1节中定义了EOF:

  

EOF扩展为整数   常量表达式,类型为int和   一个负值,由...返回   几个功能来表明   文件结束,即不再输入   来自溪流;

假设EOF等于-1是合理的,但是当使用EOF时,你不应该测试特定的值,而是使用宏。

答案 2 :(得分:7)

EOF的值是一个负整数,以区别于0到255范围内的“char”值。它通常为-1,但它可以是任何其他负数......根据POSIX规范,所以你不应该认为它是-1。

^ D字符是您在UNIX / Linux上的控制台流中键入的字符,用于告诉它逻辑上结束输入流。但在其他情况下(例如,当您从文件中读取时),它只是另一个数据字符。无论哪种方式,^ D字符(意味着输入的结尾)都不会成为应用程序代码。

正如@Bastien所说,如果getchar()失败,也会返回EOF。严格来说,您应该拨打ferrorfeof来查看EOF是代表错误还是结束。但在大多数情况下,无论哪种情况,您的应用程序都会做同样的事情。

答案 3 :(得分:4)

EOF表示文件结束。这表示文件已到达,并且不再有数据了。

修改

我的立场得到了纠正。在这种情况下,它不是文件的结尾。如上所述,它是在传递CTRL + d(linux)或CTRL + z(windows)时传递的。

答案 4 :(得分:4)

一些拼写错误:

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>

答案 5 :(得分:3)

来自终端的输入从未真正&#34;结束&#34; (除非设备断开连接),但输入多个&#34;文件&#34;到终端,所以保留一个键序列以指示输入的结束。在UNIX中,键击到EOF的转换由终端驱动程序执行,因此程序不需要将终端与其他输入文件区分开。默认情况下,驱动程序将行开头的Control-D字符转换为文件结束指示符。要在输入流中插入实际的Control-D(ASCII 04)字符,用户在其前面加上&#34; quote&#34;命令字符(通常是Control-V)。 AmigaDOS类似,但使用Control- \而不是Control-D。

在Microsoft的DOS和Windows(以及CP / M和许多DEC操作系统)中,从终端读取将永远不会产生EOF。相反,程序认识到源是终端(或其他&#34;字符设备&#34;)并将给定的保留字符或序列解释为文件结束指示符;最常见的是这是一个ASCII Control-Z,代码26.一些MS-DOS程序,包括Microsoft MS-DOS shell(COMMAND.COM)和操作系统实用程序(如EDLIN)的一部分,处理Control-Z在文本文件中标记有意义数据的结尾,和/或在写入文本文件时将Control-Z附加到末尾。这样做有两个原因:

  
    
        
  1. 与CP / M的向后兼容性。 CP / M文件系统仅以128字节&#34;记录&#34;的倍数记录文件的长度,因此按照惯例,如果有意义的数据在中间结束,则使用Control-Z字符标记有意义数据的结尾记录。 MS-DOS文件系统始终记录文件的确切字节长度,因此在MS-DOS上永远不需要这样做。

  2.     
  3. 它允许程序使用相同的代码从终端和文本文件中读取输入。

  4.        

答案 6 :(得分:1)

#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我得到了输出:-1 - 在EOF。 所以我认为-1是EOF的值。

尝试其他输入而不是Ctrl-D,如Ctrl-Z。 我认为它因编译器而异。

答案 7 :(得分:1)

为简单起见:EOF是值为-1的整数类型。因此,我们必须使用整数变量来测试EOF。

答案 8 :(得分:-1)

#include <stdio.h>

int main() {
    int c;
    while((c = getchar()) != EOF) { 
        putchar(c);
    }    
    printf("%d  at EOF\n", c);
}

修改了上面的代码,使EOF更加清晰,按Ctrl + d和putchar用于打印char,避免在while循环中使用printf。

答案 9 :(得分:-1)

int c;

while((c = getchar())!= 10)
{
    if( getchar() == EOF )
        break;

     printf(" %d\n", c);
}