是否将以Null结尾的字符串的“ NULL”或“ \ 0”符号存储在文件中?

时间:2019-09-29 16:18:18

标签: c++ c string file null

如果我要将以Null结尾的字符串存储到文件中,并且该文件仅包含该字符串,则是文件中存储的“ \ 0”或“ NULL”字符(在“ EOF”之前(结束文件)签名)?

此外:结果是否取决于操作系统以及我将在其上编译源代码的编译器?

3 个答案:

答案 0 :(得分:3)

您也许可以将空字符写入文本文件,但几乎可以肯定不愿意。

字符串(定义为“以第一个空字符结尾并包括第一个空字符的连续字符序列”)是一种内存中数据格式。

文本流由一系列组成:

  

文本流是由字符组成的有序序列    lines ,每行包含零个或多个字符以及一个换行符。最后一行是否需要   终止换行符是实现定义的。

一个字符串可能包含也可能不包含一行文本。如果它代表一行文本,则可能包含或可能不包含换行符'\n'(您需要自己对其进行跟踪)。

如果内存中有一系列字符串,通常将它们写入文本文件的方法是将每个字符串的内容(不包括终止空字符)写入文件,必要时添加换行符。像fprintffputs这样的函数假定它们的参数是 strings ,因此它们要忽略'\0'

您可以 向文本流中写入一个空字符,但这是实现定义的内容,它将实际写入文件中。您可以向二进制流中写入空字符或任何字节值-但随后就不能安全地使用字符串函数(strlen()等,甚至fgets()fputs() )上写入或读取流的数据。 (实际上,大多数系统允许将空字符写入文本文件或从文本文件中读取空字符,尽管许多标准库函数都假定文本文件仅包含可打印字符。)

答案 1 :(得分:2)

'\0'不是打印字符,因此,如果在文本模式下使用io流,那么通过这种流将io流写入文件时是否保留它取决于实现。

7.21.2p2

  

文本流是由字符组成的有序序列   行,每行由零个或多个字符加一个   终止换行符。最后一行是否需要   终止换行符是实现定义的。性格   可能必须在输入和输出到以下位置时添加,更改或删除   符合用于在主机中表示文本的不同约定   环境。因此,不需要一一对应   在流中的字符和外部字符之间   表示。从文本流读取的数据将必然   比较等于之前写入该流的数据   仅在以下情况下:数据仅包含打印字符和控件   字符水平制表符和换行符;没有换行符   在紧跟空格字符之前;最后一个字符是   换行符。是否写出空格字符   读入时换行符出现之前   实现定义的。

如果通过二进制流(例如,用'\0'fopen("file","wb")通过二进制流(将fputc('\0',f)写入文件),则应该能够取回它。

答案 2 :(得分:1)

否,将字符串写入文件的函数将不包含终止null。您可以使用需要字节计数的函数将null写入文件,但这没有任何意义,因为没有相应的读取函数。