C fread读取的安全最大记录数

C fread读取的安全最大记录数,c,mingw,fread,C,Mingw,Fread,我使用fread从文件中读取大量图像数据(>1MB)。我最近在MinGW上遇到了一个bug,它与Windows网络共享在一起,只需给fread打一个电话就可以了 fread(file, 4, 100000, data); 可靠地失败,出现“无效参数”错误,但调用了10次 fread(file, 4, 10000, data); data += 10000; 成功并产生正确的结果。我推断fread一定有一个最大尺寸,这是我以前不知道的。我将fread的允许大小一分为二,发现它在31000到32

我使用fread从文件中读取大量图像数据(>1MB)。我最近在MinGW上遇到了一个bug,它与Windows网络共享在一起,只需给fread打一个电话就可以了

fread(file, 4, 100000, data);
可靠地失败,出现“无效参数”错误,但调用了10次

fread(file, 4, 10000, data); data += 10000;

成功并产生正确的结果。我推断fread一定有一个最大尺寸,这是我以前不知道的。我将fread的允许大小一分为二,发现它在31000到32000块4字节之间。以前有人遇到过这种情况吗?这是MinGW的一只虫子吗?有没有办法确定fread的最大“安全”大小?

fread()
不应返回短项目计数,除非出现读取错误或文件结束。这听起来像是链接所针对的C库中的一个bug(默认情况下,MinGW不会链接到Microsoft的C库吗?)

这是MSVCRT(MinGW使用的Microsoft Visual C运行时)中的一个已知bug,
fread
(可能还有底层的
\u read
或其他任何东西)在中等长度的读取时失败。您可以将读取的内容分解为更小的部分,编写自己的
fread
版本来替换系统版本(但仅当在损坏的系统上编译时才执行此操作!),或者切换到一个不充满bug的更好的运行时环境(如cygwin)…

这很奇怪,尤其是因为
EINVAL
不是
fread
的记录错误代码。您是如何进行错误检查的?
file
a
file*
?因为
fread
的第一个参数是缓冲区,而不是文件。文件是float*,数据是file*。我正在用ferror()检查是否存在错误,并通过strerror()获取错误消息(perror()给出了相同的结果)。在坏系统上编译?你是说编译坏了的系统吗?