C++ fread有时返回大于4GiB的文件的错误值

C++ fread有时返回大于4GiB的文件的错误值,c++,c,fread,C++,C,Fread,我试图读取一个由30e6个位置组成的大二进制文件,每个位置有195个双精度。 由于文件太大,无法全部读取到内存中,所以我按10000个位置的块读取它。然后我用它做一些计算,然后读下一段 因为我需要随机访问该文件,所以我编写了一个函数,从该文件中读取给定的块unsigned int chunk,并将其存储在**chunk\u数据中。函数返回读取的位置总数 unsigned int read_chunk(double **chunk_data, unsigned int chunk) { F

我试图读取一个由30e6个位置组成的大二进制文件,每个位置有195个双精度。 由于文件太大,无法全部读取到内存中,所以我按10000个位置的块读取它。然后我用它做一些计算,然后读下一段

因为我需要随机访问该文件,所以我编写了一个函数,从该文件中读取给定的块unsigned int chunk,并将其存储在**chunk\u数据中。函数返回读取的位置总数

unsigned int read_chunk(double **chunk_data, unsigned int chunk) {
    FILE *in_glf_fh;
    unsigned int total_bytes_read = 0;

    // Define chunk start and end positions
    unsigned int start_pos = chunk * 10000;
    unsigned int end_pos = start_pos + 10000 - 1;
    unsigned int chunk_size = end_pos - start_pos + 1;

    // Open input file
    in_glf_fh = fopen(in_glf, "rb");
    if( in_glf_fh == NULL )
        error("ERROR: cannot open file!");

    // Search start position
    if( fseek(in_glf_fh, start_pos * 195 * sizeof(double), SEEK_SET) != 0 )
        error("ERROR: cannot seek file!");

    // Read data from file
    for(unsigned int c = 0; c < chunk_size; c++) {
         unsigned int bytes_read = fread ( (void*) chunk_data[c], sizeof(double), 195, in_glf_fh);
         if( bytes_read != 195 && !feof(in_glf_fh) )
             error("ERROR: cannot read file!");
         total_bytes_read += bytes_read;
    }

    fclose(in_glf_fh);
    return( total_bytes_read/195 );
}
在确定30e6的位置不是十六进制之后,有人知道什么可能发生吗?(30000000):考虑FSETION问题:文件有46800000000个字节。16位和32位平台上的普通fseek仅限于前2^32-1字节=4294967295

根据程序运行的平台,您可能必须使用lseek64或其等效工具。在Linux上,有

使用lseek与

定义_文件_偏移量_位64

利泽克

lseek64

确定30e6位置不是十六进制,而是30000000:考虑FSETION问题:文件有46800000000字节。16位和32位平台上的普通fseek仅限于前2^32-1字节=4294967295

根据程序运行的平台,您可能必须使用lseek64或其等效工具。在Linux上,有

使用lseek与

定义_文件_偏移量_位64

利泽克

lseek64


您的平台上的sizeofint是什么?问题的标题应该是有意义的。它将帮助用户总结您的问题。您已经为块分配了内存?您正在溢出传递给fseek的临时int。30e6*195*sizeofdouble=~=460亿。您的平台上的SizeOfFint是什么?问题的标题应该是有意义的。它将帮助用户总结您的问题。您已经为块分配了内存?您正在溢出传递给fseek的临时int。30e6*195*sizeofdouble=~=460亿。普通香草口味的限制取决于平台;在许多平台上,它将是2*64减去一些ε。另一方面,大多数平台仍然有32位整数,他用整数或无符号整数做所有算术运算,这将溢出。@JamesKanze:是的。我已经限定了我的句子。将它设为2^31-1,尽管偏移量参数很长。普通的fseek的限制取决于平台;在许多平台上,它将是2*64减去一些ε。另一方面,大多数平台仍然有32位整数,他用整数或无符号整数做所有算术运算,这将溢出。@JamesKanze:是的。我已经限定了我的句子。但是,将其设为2^31-1,偏移量参数是一个长参数。
chunk of 1 pos, wrong at chunk 22025475
chunk of 10000 pos, wrong at chunk 2203
chunk of 100000 pos, wrong at chunk 221