我正在尝试读取一个由 30e6 个位置组成的大二进制文件,每个位置有 195 个双精度。由于文件太大而无法全部读入内存,因此我按 10000 个位置的块读取它。然后我用它做一些计算并读取下一个块......
由于我需要随机访问文件,我编写了一个函数来从文件中读取给定的块(无符号整数块)并将其存储在 **chunk_data 中。该函数返回读取的位置总数。
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 );
}
问题是,在阅读了一些块之后,fread()
开始给出错误的值!此外,根据块大小,fread()
开始表现奇怪的位置会有所不同:
chunk of 1 pos, wrong at chunk 22025475
chunk of 10000 pos, wrong at chunk 2203
chunk of 100000 pos, wrong at chunk 221
任何人都知道可能会发生什么?