AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 537858
Accepted
gerrit
gerrit
Asked: 2019-08-29 03:03:40 +0800 CST2019-08-29 03:03:40 +0800 CST 2019-08-29 03:03:40 +0800 CST

文件实际上是否包含文件结束 (EOF) 字符?[复制]

  • 772
这个问题在这里已经有了答案:
文件中的最后一个字符是什么? (3 个回答)
EOT 和 EOF 之间的区别 3 个答案
3年前关闭。

美国国家海洋和大气管理局 (NOAA)的地球静止运行环境卫星 (GOES)-R 产品用户指南 (PUG)包含以下对纯文本文件 (§4.3) 的冗长描述(重点是我的):

Unix 文本文件格式用于 1b 级和 2+ 级半静态源数据文件的一小部分。Unix 文本文件格式(减去文件结尾字符)嵌入 GRB 元数据包中,以存储 netCDF 文件规范的基于 XML 的 netCDF 标记语言 (NcML) 表示,其中包括产品元数据的值。

Unix 文本文件格式是电子文本的一系列行(即记录),其长度可能可变。对于 GOES-R 地面系统,电子文本、换行符和文件结尾字符符合美国信息交换标准代码 (ASCII)。每行的末尾是换行符。在文件末尾,有一个文件结束符。

这是对文件内容的准确描述吗?我认为文件结束是操作系统或库例程在无法从文件(或其他流)中读取更多数据时返回的条件。这个字节实际上包含在文件中吗?

files ascii
  • 3 3 个回答
  • 11060 Views

3 个回答

  • Voted
  1. Best Answer
    ilkkachu
    2019-08-30T06:55:06+08:002019-08-30T06:55:06+08:00

    Unix 文本文件格式是电子文本的一系列行(即记录),其长度可能可变。每行的末尾是换行符。在文件末尾,有一个文件结束符。

    这是对文件内容的准确描述吗?

    直到但不包括最后一个粗体部分,是的。但我不知道有任何 Unixy 系统会使用文件结尾字符,它们都将文件的长度存储到一个字节,因此不需要这样的标记。

    再说一次,似乎有些系统确实使用了文件结尾字符。至少维基百科声称:

    CP/M 文件系统仅以 128 字节“记录”的倍数记录文件长度,因此按照惯例,如果有意义数据在记录的中间结束,则使用 Control-Z 字符来标记有意义数据的结束。

    将文件长度仅存储到一个块将需要某种自定义来对数据流中最后一行的末尾进行编码。任何处理二进制数据的程序当然也必须以某种方式处理更细粒度的文件大小。但是,对于二进制文件,可能更容易忽略尾随的“额外”字节。

    我想我已经看到 Control-Z 在 MS-DOS 上用作 EOF 标记,但在那里也没有必要。

    引用的文本似乎对当前系统中的文本文件有错误的认识。如果我们看一下 POSIX 标准所说的,没有提到文本文件的文件结束字符或标记,只是它们不包含 NUL 字节并且由行组成(以换行符结尾)。

    另请参阅:文件中的最后一个字符是什么?

    至于这部分...

    对于 GOES-R 地面系统,[...] 和文件结尾字符符合美国信息交换标准代码 (ASCII)。

    就像其他人在评论中所说的那样,ASCII 中没有文件结尾字符,至少没有那个名称(*)。上面提到的Control-Z是26位,或者“替代”(SUB),“用来表示乱码或无效字符”。因此,仅基于该文本,很难知道 EOF 字符是什么,如果使用它。

    (* 有“文本结束”(ETX,代码 3)、“传输结束”(EOT,代码 4)、“传输块结束”(ETB,23)、“媒体结束”(EOM,25)和也是“文件分隔符”(FS,28)。关闭,但不准确。)

    我认为文件结束是操作系统或库例程在无法从文件(或其他流)中读取更多数据时返回的条件。

    确实如此。read()当到达文件末尾时,系统调用返回零字节(没有错误),而一些 stdio 函数 ( getchar()) 有一个返回特殊值,不出所料地称为EOF。

    另请参阅:EOT 和 EOF 之间的区别

    • 4
  2. Philip Couling
    2019-08-29T14:29:32+08:002019-08-29T14:29:32+08:00

    这看起来对于他们正在讨论的文件格式非常具体。作为一般规则文件不需要 EOF 字符。Non 是在没有程序明确编写的情况下添加的。

    检查 ASCII 表我没有看到 EOF 字符。他们可能指的是 EOT 或 FS 角色,但这并不清楚。https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html

    然而,在某些文件格式中,在文件末尾添加一个标记是很常见的。特别是用于通信的简单文件格式。这可以防止文件被无意截断。如果您知道文件必须以特定标记结尾,并且该标记仅出现在末尾,则. 您可以轻松判断您收到的是整个文件还是部分文件。当我读到它时,他们指的是这种类型的标记。

    • 3
  3. Austin Hemmelgarn
    2019-08-29T11:27:56+08:002019-08-29T11:27:56+08:00

    他们所指的“文件结尾”字符可能是作为文件中最后一个字符出现的单个换行符。UNIX 和类 UNIX 系统上的大多数传统文本文件都以这样的方式结束,以便您可以使用cat命令(或类似的东西)来显示文件内容并确保下一个命令提示符将在它自己的行上。

    如果没有看到最后的换行符,一些表现不佳的应用程序实际上无法正确解析文件。在这方面,它有点像 UTF-8 编码文本中的 Unicode 字节顺序标记,根本不需要它(实际上,根据大多数标准,它甚至不应该存在),但一些应用程序拒绝解释事物没有它的 UTF-8。


    但是,从操作系统本身的角度来看,不存在这样的“角色”。文件系统存储文件的正确大小,当被要求读取文件时,操作系统总共返回那么多数据,所以即使有这样的概念也没有意义,更不用说为它设置一个字符了。

    有些人混淆了这个概念的 EOT 控制代码 (^D),因为它在类 UNIX 系统上广泛用于表示交互式输入流的结束,但这只是源自原始用法的约定(表示结束通过某些通信链路进行传输)。请注意,这与 DOS 系统有很大不同,在 DOS 系统中,^Z 用于在交互式输入和实际文件中实际发出文件结束的信号。EOT 控制代码实际上并没有出现在应用程序看到的数据流中,它由终端解释,当它遇到 ^D 时向应用程序发出文件结束条件的信号。

    • -1

相关问题

  • 删除文件名后缀最小的文件

  • 列出根据特定内容行排序的文件

  • 如何提前知道 .zip 内部是否有父目录

  • 如何找到特定的文件类型并将它们 tar?

  • du/df 和 ls 报告不同的磁盘使用情况

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve