用C代码表示EOF?

时间:2012-09-12 13:39:21

标签: c character ascii eof

换行符在C代码中由"\n"表示。是否有等效的文件结束(EOF)字符?

11 个答案:

答案 0 :(得分:58)

EOF不是一个角色(在大多数现代操作系统中)。它只是在到达流末尾时应用于文件流的条件。之所以产生混淆,是因为用户可以通过键入特殊字符(例如,Unix,Linux,等等中的Control-D)来信号 EOF以获得控制台输入,但此字符不是在运行程序中可以看到它被操作系统捕获,而操作系统又将EOF发送给过程。

注意:在一些非常旧的操作系统中,EOF 是一个字符,例如CP / M中的Control-Z,但这是一个粗略的黑客,以避免在文件系统目录中维护实际文件长度的开销。

答案 1 :(得分:7)

没有。 EOF不是字符,而是文件句柄的状态。

虽然ASCII字符集中有控制字符代表数据的结尾,但这些字符通常不用于表示文件的结尾。例如EOT(^ D),在某些情况下几乎发出相同的信号。

当标准C库使用有符号整数返回字符并使用-1作为文件末尾时,这实际上只是指示发生错误的信号。我没有C标准,但引用SUSv3:

  

如果设置了流的文件结束指示符,或者流位于文件结尾,则应设置流的文件结束指示符,并且fgetc()将返回EOF。如果发生读错误,则应设置流的错误指示符,fgetc()应返回EOF,并设置errno以指示错误。

答案 2 :(得分:6)

EOF不是角色。它不能是:(二进制)文件可以包含任何字符。假设你有一个不断增加的字节的文件,0 1 2 3 ... 255和0 1 ... 255,总共512字节。无论你认为EOF这256个可能的字节中的哪一个,该文件都将缩短。

这就是getchar()等人的原因。返回int。可能的返回值范围是char可以具有的值,加上真正的intEOF(在stdio.h中定义)。这也是为什么在检查char之前将返回值转换为EOF 的原因。

请注意,某些协议具有“EOF”“字符”。 ASCII具有“文本结束”,“传输结束”,“传输块结束”和“中等结束”。其他答案都提到了旧的操作系统。我自己在Linux上输入^ D,在Windows控制台上输入^ Z以停止提供程序输入。 (但是通过管道读取的文件可以在任何地方都有^ D和^ Z字符,并且当它们用完字节时只发出EOF信号。)C字符串以'\0'字符终止,但这也意味着它们不能包含字符'\0'。这就是为什么所有C非字符串数据函数都使用char数组(包含数据)和size_t(知道数据结束位置)的原因。

编辑:C99标准§7.19.1.3规定:

  

宏是[...]   的 EOF
  它扩展为一个整数常量表达式,类型为int,负数值由多个函数返回   表示文件结束,即不再有来自流的输入;

答案 3 :(得分:3)

我已阅读所有评论。有趣的是注意到打印出来时会发生什么:

printf("\nInteger =    %d\n", EOF);             //OUTPUT = -1
printf("Decimal =    %d\n", EOF);               //OUTPUT = -1
printf("Octal =  %o\n", EOF);                   //OUTPUT = 37777777777
printf("Hexadecimal =  %x\n", EOF);             //OUTPUT = ffffffff
printf("Double and float =  %f\n", EOF);        //OUTPUT = 0.000000
printf("Long double =  %Lf\n", EOF);            //OUTPUT = 0.000000
printf("Character =  %c\n", EOF);               //OUTPUT = nothing

正如我们在这里看到的,EOF不是一个角色(无论如何)。

答案 4 :(得分:1)

Windows上的命令解释程序识别的EOF字符(以及MSDOS和CP / M)是0x1a(十进制26,又名Ctrl + Z又称SUB)

今天仍然可以使用它来标记二进制文件中人类可读标题的结尾:如果文件以&#34开头;某些描述\ x1a"用户可以使用TYPE命令将文件内容转储到控制台,转储将停止在EOF 字符,即打印某些描述并停止,而不是继续随后的垃圾。

答案 5 :(得分:1)

EOF的价值不能与任何真实角色混淆。

如果a= getchar(),那么我们必须声明a足够大,以保留getchar()返回的任何值。我们无法使用char,因为除了字符之外,a必须足够大才能保留EOF。

答案 6 :(得分:1)

答案是否定的,但是......

由于fgets()

的行为,您可能会感到困惑

来自http://www.cplusplus.com/reference/cstdio/fgets/

  

从流中读取字符并将其作为C字符串存储到str中,直到读取(num-1)个字符或到达换行符或文件结尾为止,以先发生者为准

答案 7 :(得分:0)

这取决于系统,但通常为-1。见here

答案 8 :(得分:0)

在stdio.h中有int类型的常量EOF。任何标准都没有指定等效的字符文字。

答案 9 :(得分:0)

我认为它可能因系统而异,但一种检查方法是使用printf

#include <stdio.h>
int main(void)
{
    printf("%d", EOF);
    return 0;
}

我在Windows上执行了此操作,-1已打印到控制台。希望这会有所帮助。

答案 10 :(得分:0)

我一直在研究EOF信号。在Dennis Ritchie撰写的《用C语言编程》一书中,在介绍putchar()和getchar()命令时首先遇到了它。 它基本上标记了字符串输入的结尾。

例如让我们编写一个程序,寻找两个数字输入并打印它们的总和。在每个数字输入之后,您会注意到按Enter键以标记已完成iput操作的信号。但是在处理字符串时,Enter会被读为另一个字符['\ n':换行符]。要标记输入的终止,请在全新行中输入^ Z(键盘上的Ctrl + Z),然后输入。这表示要执行的下一行命令。

#include <stdio.h>

int main()
{
char c;
int i = 0;
printf("INPUT:\t");
c = getchar();

while (c != EOF)
{
   ++i;
   c = getchar();
   
};

printf("NUMBER OF CHARACTERS %d.", i);

return 0;}

上面是用于计算包括'\ n'(换行符)和'\ t'(空格)字符在内的字符数的代码。如果您不想计数换行符,请执行以下操作:

#include <stdio.h>

int main()
{
char c;
int i = 0;
printf("INPUT:\t");
c = getchar();

while (c != EOF)
{
    if (c != '\n')
    {
        ++i;
    }

    c = getchar();
    };

printf("NUMBER OF CHARACTERS %d.", i);

return 0;}. 

现在要输入的主要思想。这很简单: 写下您想要的所有故事,然后换行,输入^ Z,然后再次输入。