【问题标题】:Can ALL 256 byte values be written to a text file without any issues?可以将所有 256 字节值写入文本文件而没有任何问题吗?
【发布时间】:2016-02-27 17:24:49
【问题描述】:

将所有 (0-255) 字节值写入文本文件会导致任何错误吗? 由于字节 '0' 是 EOF,这是否意味着我的文件可以只包含一个 EOF 字符而后面的所有内容都被忽略?

编辑:文件可以包含任何字节值 (0-255),并且可以根据需要重复多次。

我现在感觉很笨。

【问题讨论】:

  • 取决于“错误”的含义。如果您尝试将该文件解释为某种文件类型,它可能无法正常工作。但是从 C++ 的角度来看,在文件中包含任何这些字节并没有错。为什么你认为 0 字节意味着 EOF?因为它是用来表示一个C字符串的结束?这些根本不是一回事。
  • 好的,但是EOF是什么,如果我们用完所有字节,文件结尾将如何标记。我可能错过了什么。
  • 不。我执行一个程序,几乎每天都将所有 0-255 字节写入某个文件。该程序称为“C++ 编译器”。
  • 这是否意味着我可以将 1 和 0 的任意组合输入到文件中并且不会破坏任何内容?
  • EOF 用作读取函数的返回值,例如 scanf,但该值不是从文件中读取的。

标签: c++ file byte ascii eof


【解决方案1】:

(在某些系统上)文本文件不同于“二进制”文件是有原因的。

据我所知,没有将任何字节写入文件会导致直接问题的系统,但是将“任何字节”作为文本文件写入或读取可能会导致许多问题:

  • 某些字节可能会被转换为另一个字节,或多个字节 - 例如在 DOS 和 Windows 中,写入时的换行符('\n' 或字节 10 (0x0a))将变为 "\r\n")。反之亦然,读取该序列将只是一个字符。

  • 某些字节或字节组合在读取时可被视为“文件结尾”。在 Windows 中,即 CTRL-Z。这种用特殊字符标记文件结尾的系统的起源是某些操作系统将具有文件大小的“块数”,而不是将实际大小存储在文件的元数据中。这意味着文件的大小将四舍五入到最近的块 - 例如512 字节,如果你想要一个 108 字节长的文件,你会写 108 字节的文本,然后 CTRL-Z [或系统使用的任何东西] 来标记“这个块的其余部分不是文本”。

二进制文件绝对可以包含任何字节,如果字节通过某种无法处理绝对任何字节组合的链接(例如网络)传输,则由该网络链接的层来转换将其转换为有效的东西,然后再将其转换回来。

【讨论】:

    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 2018-11-21
    • 2015-12-10
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2012-09-22
    相关资源
    最近更新 更多