c - 什么是二进制文件的 EOF?健康)状况?特点?

标签 c binaryfiles eof

到目前为止,我知道 EOF 是一个特殊字符,自动插入到文本文件的末尾以指示其结束。但我现在觉得需要对此进行更多澄清。我在 Google 和 Wikipedia 页面上查看了 EOF,但他们无法回答以下问题,而且也没有确切的 Stack Overflow 链接。所以请帮我解决这个问题:

  • 我的书说二进制模式文件根据文件目录条目中存在的字符数来跟踪文件结尾。 (与具有特殊 EOF 字符来标记结束的文本文件相反)。那么 EOF 在二进制文件的上下文中是怎么回事呢?我很困惑,因为在下面的程序中,我在以二进制模式读取 .exe 文件时成功地使用了 !=EOF 比较:

     #include<stdio.h>
     #include<stdlib.h>
    
     int main()
     {
    
      int ch;   
      FILE *fp1,*fp2;
    
      fp1=fopen("source.exe","rb");
      fp2=fopen("dest.exe","wb");
    
      if(fp1==NULL||fp2==NULL)
      {
      printf("Error opening files");
      exit(-1);
      }
    
      while((ch=getc(fp1))!=EOF)
      putc(ch,fp2);
    
      fclose(fp1);
      fclose(fp2);
    
      }
    
  • EOF 是一个特殊的“字符”吗?或者它是维基百科所说的条件,计算机知道何时返回特定值的条件,例如-1(EOF 在我的电脑上)?这种“条件”的示例是当字符读取函数完成读取所有存在的字符时,或者当字符/字符串 I/O 函数在读取/写入时遇到错误?

    有趣的是,EOF 的 Stack Overflow 标签混合了 EOF 的这两种定义。 EOF 的标签表示“在编程领域,EOF 是一个字节序列(或字符),表示在此之后没有更多内容。”,而它在“关于”部分中还提到,“文件结束(通常缩写为 EOF)是计算机操作系统中无法从数据源读取更多数据的情况。数据源通常称为文件或流。”

但我有一种强烈的感觉 EOF 不会是一个字符,因为其他所有函数似乎在 I/O 期间遇到错误时都会返回它。

如果你能帮我解决这个问题,那你就太好了。

最佳答案

C 为您提供的各种 EOF 指示符不一定与文件系统如何标记文件结尾有任何关系。

大多数现代文件系统都知道文件的长度,因为它们将其记录在某个地方,与文件的内容分开。读取文件的例程会跟踪您正在阅读的位置,并在您读到结尾时停止。 C 库例程生成 EOF 值返回给您;他们没有返回文件中实际存在的值。

请注意,C 库例程返回的 EOF 实际上不是一个字符。 C 库例程通常返回 int,而 int字符值或 EOF。例如,在一种实现中,字符可能具有从 0 到 255 的值,而 EOF 可能具有值 −1。当库例程遇到文件末尾时,它实际上并没有看到-1 字符,因为不存在这样的字符。相反,底层系统例程告诉它已到达文件末尾,并通过返回 -1 给您作为响应。

旧的和粗糙的文件系统可能在文件中有一个标记文件结束的值。由于各种原因,这通常是不可取的。在其最简单的实现中,它不可能在文件中存储任意数据,因为您不能将文件结束标记存储为数据。然而,可以有一种实现,其中文件中的原始数据包含指示文件结尾的内容,但在读取或写入时会转换数据,以便可以存储任意数据。 (例如,通过“引用”文件结束标记。)

在某些情况下,文件结束标记之类的东西也会出现在流中。这在从终端(或伪终端或类似终端的设备)读取时很常见。在 Windows 上,按下 control-Z 表示用户已完成输入,到达文件末尾的处理方式类似。这并不意味着 control-Z 是 EOF。从终端读取的软件看到 control-Z,将其视为文件结束,并返回文件结束指示,这可能与 control-Z 不同。在 Unix 上,control-D 通常是一个类似的标记输入结束的标记。

关于c - 什么是二进制文件的 EOF?健康)状况?特点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16677632/

相关文章:

c - 为什么我的 PRIME1 - SPOJ 实现会收到 SIGSEGV,即使它在我的电脑中的所有测试用例中运行良好?

c - 如何评估c中的双指针?

c - 如何在 c 中制作二进制文件 ---- struct within a struct

c - C 中的 Pthread 加入?

Boost序列化文件结尾

c - 标准输入中的文件结尾

c - 在 for 循环中重复使用 switch 语句

github - 将二进制发行版添加到 github 的下载链接

python3 : do a for loop once more when looped over the whole file

c - 从文件读取时出错