在C中读取二进制文件的结果很奇怪

时间:2014-09-25 19:56:03

标签: c binaryfiles fread

我正在使用64位Xubuntu 14.04。

我有一个相当大的C程序并且为了测试新功能,我通常在一个单独的程序中实现它们,以便在将它们合并到主程序之前消除任何错误和诸如此类的错误。

我有一个函数,它接受一个const char *作为参数,以指示文件的路径(在这种情况下为/dev/rx.bin)。它打开文件,将特定数量的字节读入数组,然后在将新数据导出到其他文件之前执行一些操作。

首先我分配数组:

int16_t samples = (int16_t *)calloc(rx_length, 2 * sizeof(samples[0]));

请注意,rx_length是例如100个样本(在实际程序中接近100 000),并且它是从相同的常量计算的。

接下来我打开文件并从中读取:

uint32_t num_samples_read;
FILE *in_file   = fopen(file, "rb");
if (in_file == NULL){
    ferror(in_file);
    return 1;
}
num_samples_read =  fread(samples, 2 * sizeof(samples[0]), rx_length, in_file);

这是踢球者;来自fread的返回值在测试程序和主程序之间是不一样的,而代码是相同的。例如,当我应该从400 kB文件中读取100 000个样本时(100 000个样本,一个int16_t用于实部,一个int16_t用于虚部,每个样本最多加4个字节),返回的值为99328 in主程序。对于我的生活,我无法弄清楚为什么。

我测试了任何计算中使用的每个变量的输出,直到fread()一切都相同。

我还应该注意到该函数位于我的主程序中的一个单独的头文件中,但我认为,因为打印每个常量/定义会给出预期的结果,所以它不存在于我犯错的地方。

如果有任何我可能错过的内容,我们将非常感谢任何意见。

问候。

1 个答案:

答案 0 :(得分:0)

谢谢chux提醒我关闭并回答。

关闭文件是我的主程序中的问题,它从未在测试环境中发生,因为输入文件没有在那里被修改。

一旦RX线程完成其任务,请调用fclose():

rx_task_out:
    fclose(p->out_file);
    // close device
    // free sample buffer
    return NULL;

以前,只有创建RX线程的错误状态才会导致它关闭文件。