C 具有大nitems参数的fread平台相关行为
我创建了下面的测试程序,试图在更大的系统中调试一个问题。该程序试图从一个小文件中读取大量数据,但我发现程序的行为在不同平台上有所不同 预期行为 我预期的行为,以及我在某些平台(例如Mac OS X、CentOS 6.4)上看到的行为,是程序读取N字节(文件大小),然后以C 具有大nitems参数的fread平台相关行为,c,portability,fread,stdio,C,Portability,Fread,Stdio,我创建了下面的测试程序,试图在更大的系统中调试一个问题。该程序试图从一个小文件中读取大量数据,但我发现程序的行为在不同平台上有所不同 预期行为 我预期的行为,以及我在某些平台(例如Mac OS X、CentOS 6.4)上看到的行为,是程序读取N字节(文件大小),然后以EOF条件终止: Read 2 bytes. OK. EOF 对于我的测试,我使用echo“a”>test.txt创建了test.txt,它应该是strerror(errno),而不是err。四个感叹号简直太傻了。@Jenserr
EOF
条件终止:
Read 2 bytes.
OK. EOF
对于我的测试,我使用
echo“a”>test.txt创建了test.txt,它应该是strerror(errno)
,而不是err。四个感叹号简直太傻了。@Jenserr
是我将ferror
中的错误代码存储在--fread
没有设置errno
你的CentOS有足够的内存和交换空间吗?@Les我想是的。。。它在malloc
步骤中没有失败。根据read()的手册页,最大字符数受系统定义的值限制:“SSIZE_max”是否检查了该值,并确保请求读取的代码的1/2 gig字节小于该大小。
Read 0 bytes.
NOOOOOOOOOOOOOO!!!! Error: Operation not permitted
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]) {
FILE* file = fopen("test.txt", "rb");
size_t chunk = 0x7FFFFFFF;
char* buf = malloc(chunk);
if (buf == NULL) {
printf("malloc failed\n");
return 1;
}
int count = fread(buf, 1, chunk, file);
printf("Read %i bytes.\n", count);
int eof = feof(file);
if (eof) {
printf("OK. EOF\n");
}
int err = ferror(file);
if (err) {
printf("NOOOOOOOOOOOOOO!!!! Error: %s\n", strerror(err));
return 1;
}
free(buf);
return 0;
}