你可以通过过去的EOF来创建未定义的数据吗?

时间:2016-07-21 07:13:31

标签: c++ c fwrite fseek

如果你使用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);

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

2 个答案:

答案 0 :(得分:5)

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

  

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

答案 1 :(得分:5)

它都是零。事实上,如果你跳过足够的时间来跳过整个块,UNIX就会把它们称为稀疏文件,只会分配你写入的块,如果你以后尝试从那些从未写入的块读取,它没有读取磁盘,只是假装有一个全零的块并返回你要求的部分。