Windows发生意外行为

时间:2013-01-02 17:53:03

标签: winapi fread

因此fread在Win7 x64上出现意外行为。

file = fopen(path, "rb");
fseek(file, 0, SEEK_END);
fileSize = ftell(file);
fseek(file, 0, SEEK_SET);
buffer = malloc(fileSize);
length = fread(buffer, fileSize, 1, file);

fread将返回1个字节,而(ferror和feof都返回0)

length = fread(buffer, 1, fileSize, file);

fread将返回与fileSize相同的字节数。 MSDN说“fread函数读取来自输入流的大小字节的项目,并将它们存储在缓冲区中。”我将其解释为意味着任何一段代码都应该读取相同数量的数据。有谁知道为什么恐惧不像我期望的那样工作?

2 个答案:

答案 0 :(得分:2)

他们确实读取了相同数量的数据。读取的字节数是size参数乘以count参数。返回的是读取的项目数。

所以在第一种情况下你要求1个大小为fileSize的项目,它返回1。 在第二种情况下,您要求提供大小为1的fileSize项,并返回fileSize。

答案 1 :(得分:1)

fread返回“实际读取的完整项目数”,而不是读取的字节数。

使用fread(buffer, fileSize, 1, file);,您正在阅读一个大小为fileSize的项目(fread因此会在成功时返回1)而使用fread(buffer, 1, fileSize, file);则您正在阅读{{1}大小为1的项目,它将返回读取的字节数(正如您所期望的那样)。