打开读取文件的错误:对于定义的数据types,值太大

#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> #include <iostream> using namespace std; #define FILEPATH "file.txt" #define NUMINTS (268435455) #define FILESIZE (NUMINTS * sizeof(int)) int main() { int i=sizeof(int); int fd; double *map; //mmapped array of int's fd = open(FILEPATH, O_RDONLY); if (fd == -1) { perror("Error opening file for reading"); exit(EXIT_FAILURE); } map = (double*)mmap(0, FILESIZE, PROT_READ, MAP_SHARED, fd, 0); if (map == MAP_FAILED) { close(fd); perror("Error mmapping the file"); exit(EXIT_FAILURE); } for (i = 100000; i <=100100; ++i) { cout<<map[i]<<endl; } if (munmap(map, FILESIZE) == -1) { perror("Error un-mmapping the file"); } close(fd); return 0; } 

我收到错误,文件大小太大。

你应该检查你的mmap文件是否足够大。

并确保FILESIZE是一个int64_t数字(您需要#include <stdint.h> ):

 #define FILESIZE ((int64_t)NUMINTS * sizeof(int)) 

mmap调用之前, open成功之后,使用fstat(2)添加以下代码:

 struct stat st={0}; if (fstat(fd, &st)) { perror("fstat"); exit (EXIT_FAILURE); }; if ((int64_t)st.st_size < FILESIZE) { fprintf(stderr, "file %s has size %lld but need %lld bytes\n", FILEPATH, (long long) st.st_size, (long long) FILESIZE); exit(EXIT_FAILURE); } 

最后,用g++ -Wall -g编译你的程序并使用gdb调试器。 另外, strace(1)可能是有用的。 并确保当前目录的文件系统可以处理大文件。

您可能需要或需要定义_LARGEFILE64_SOURCE (和/或_GNU_SOURCE ),例如用g++ -Wall -g -D_LARGEFILE64_SOURCE=1编译g++ -Wall -g -D_LARGEFILE64_SOURCE=1 ; 见lseek64(3) & feature_test_macros(7)

附加物

谷歌搜索

 Value too large for defined data type 

这个coreutils FAQ很快就给出了详细的解释。 你可能应该安装一个64位的Linux发行版(或者至少重新编译你正确配置的coreutils,或者使用不同的文件系统…)

当我尝试处理一个2,626,351,763字节的文件时(这个文件超过了一个有符号的32位整数),我有这个问题。 当我用cc -m64重新编译我的程序(我正在使用Sun C 5.13 SunOS_sparc 2014/10/20编译器)时,问题就消失了。

64位系统很乐意处理大(> 2 ^ 32字节)的文件,但是如果应用程序是以32位模式编译的,那么不是那么多。