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

时间:2014-04-29 17:28:35

标签: c linux

#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;
}

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

2 个答案:

答案 0 :(得分:1)

您应该检查您的mmap - ed文件是否足够大。

并确保FILESIZEint64_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编译;见lseek64(3)&amp; feature_test_macros(7)

附加物

谷歌搜索

Value too large for defined data type 

给出了很快this coreutils FAQ的详细解释。您可能应该安装64位Linux发行版(或者至少重新编译适当配置的coreutils,或者使用不同的文件系统......)

答案 1 :(得分:0)

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

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