你能通过查看过去的EOF来创建未定义的数据吗



如果使用fseek越过文件末尾,然后在EOF之后追加数据,那么EOF和您所写内容之间的数据是否未定义?

例如,在下面的代码中,由于randomLengthPastEOF,写入的文件中会有10个字节的未定义数据吗?

unsigned char *someText= "ExampleText";
int length = 11;
int randomLengthPastEOF  = 10;
FILE *output = fopen("/Example/FilePath", "wb");
fseek(input, randomLengthPastEOF ,SEEK_END);
fwrite(someText, 1, length, output);

我找不到任何可能发生的事情的参考,所以我认为它是未定义的。

POSIX将两者之间的数据定义为零字节:http://www.unix.com/man-page/POSIX/3posix/fseek/

fseek()函数应允许在文件中现有数据的末尾之外设置文件位置指示器。如果稍后在此点写入数据,则间隙中数据的后续读取将返回值为0的字节,直到数据实际写入间隙。

它将全部为零。事实上,如果你跳得足够远,可以跳过整个块,UNIX将生成一个所谓的稀疏文件,只分配你写入的块,如果你后来试图从从未写入的块中读取,它不会读取磁盘,它只是假装有一个全零的块,并返回你要求的部分。

最新更新