【问题标题】:File input and output stream in cc中的文件输入和输出流
【发布时间】:2014-05-20 16:35:45
【问题描述】:

假设我使用 c 语言以写入模式打开一个文本文件。现在我向它添加一些文本数据。

1.内部数据是如何存储在文件中的?每个字符是否存储为 8 位 ascii 代码?

我们永远不会在写入文件的末尾添加 EOF,我们使用 fclose() 来关闭文件。

2.然后EOF如何添加到文件中?它是如何存储在文件中的?

当我们使用 getchar() 逐字符读取该文件时,我们能够检测到 EOF。现在 EOF 如果是 ctrl+z ,这些是 2 个字符 ^z 保存在文件末尾。所以 getchar() 会得到 ^ 然后 z 。所以,

3.getchar()如何检测EOF?

【问题讨论】:

  • 是的,字符单独存储为 8 位字节。如果你写出 ASCII,那么你会得到 ASCII。如果你写出一个字节0x02,那么你会得到一个字节0x02。 EOF 是文件读取函数在知道它位于文件末尾时提供的返回。它实际上不是文件中的任何内容。这些函数知道它们在最后,因为文件系统提供有关文件长度的信息,并且文件 I/O 函数跟踪它们在文件中的位置。

标签: c file eof


【解决方案1】:

EOF 不是存储在文件中的字符,而是读取文件时获得的特殊返回码。文件 I/O 系统知道文件中有多少个字符,因为它存储了文件的确切长度。当您的程序尝试在最后一个可用字符之后读取一个字符时,文件 I/O 系统返回一个特殊值 EOF,它超出了 char 的范围(因此,字符读取例程如 @ 987654325@ 返回 int 而不是 char)。

Ctrl+Z 序列也不是EOF 字符。它是一个特殊的键序列,告诉 shell 关闭与程序关联的控制台输入流。流关闭后,下一次读取会将EOF 返回到您的程序。然而,重要的是要理解 Ctrl+Z 只是一个由命令行处理器解释的键盘序列 - 与 Ctrl+C 是一个告诉命令行处理器终止程序的序列。

最后,^Z 不是存储在文件中的两个字符,它是由命令行处理器生成的 Ctrl+Z 序列的屏幕表示目视确认键盘序列已被接受。

【讨论】:

  • Microsoft DOS 确实在文件中存储了明确的 EOF 代码(x1B,IIRC),至少在某些语言和某些编辑器中是这样。
  • @BreakingBenjamin 它与读取其他字符代码的意义不同。将EOF 返回到您的程序需要特殊处理。 I/O 库查看文件或控制台流,并检查当前读取指针是否在末尾。如果是,则返回EOF;如果不是,则将文件/流中的下一个字符返回到您的程序。
  • 如果是这种情况,DOS 中“显式 EOF 代码”的用途是什么
  • DOS 是一个 very 原始系统,它发现实现一个显式的 EOF 字符比找出你已经跑出文件末尾更容易。无论是否有显式的 EOF 字符,语言库都应该在文件末尾返回一个 EOF——这不是您需要担心的事情。
  • @BreakingBenjamin MS DOS 中的显式 EOF 已经过时了很多年,如果不是几十年的话。 Here is another Q&A you may want to read.
【解决方案2】:
  1. 通常 C 将使用 Latin-1 或其他单字节 编码,但应该可以使用 UTF-8 语言环境设置。 请注意,大多数 C 字符/字符串处理例程不会 正确处理 UTF-8 或任何其他多字节编码 - 您必须使用特殊库。

    这取决于所使用的操作系统,但大多数会简单地存储 连续的字符流,带有 Line-End (CR-LF in Windows, Unixy 系统中的 \n) 字符来标记行尾 (你必须明确地把它放在那里)。

  2. 某些操作系统,例如 MS-DOS,可能会显式写入 EOF 字符到文件的末尾,但大多数没有。他们只是运行 关闭文件末尾并报告 EOF 状态。

  3. 见 2。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2021-11-19
    相关资源
    最近更新 更多