【问题标题】:Trying to read back binary data from a file, causing crash试图从文件中读回二进制数据,导致崩溃
【发布时间】:2015-10-31 22:28:28
【问题描述】:

提前感谢您的帮助。

我正在尝试调用一个函数,该函数将从我刚刚创建的正弦波二进制文件中读回日期。该文件已在 main 函数中以 w+b 打开。我想将数据复制到我的缓冲区数组,然后打印出来。

end_time 是文件中的样本总数。样本被写成浮点数。 Code Blocks 没有给出任何错误,但是程序到了这个时候就崩溃了,我不知道为什么。

void printwave(FILE *fp, int end_time)
{
   int i;

   float buffer[end_time];
   fseek(fp, 0, SEEK_SET);


   for(i=0; i==end_time; i++)
   {
        fread(buffer, sizeof(float), 1, fp);
        printf("%d\t%.2f\n", i, buffer[i]);
   }

}

感谢您的帮助, 安迪。

【问题讨论】:

  • 'for' 条件错误。应该是 i
  • 发布的代码(如果for() 语句已更正)将整个文件读入 buffer[] 数组。这是完全没有必要的。更好的是,在一个循环中,读取一个浮点数,打印一个浮点数,等等
  • 在调用fread()函数时,检查返回值(本例中应为1),确保操作成功。调用fseek()函数时,检查返回值(本例中应为0),确保操作成功。

标签: c file io binary fread


【解决方案1】:

需要检查fread()的返回值,确保没有错误

for循环的条件应该是i < end_time

文件似乎是以写模式打开的,但读写都完成了。

fseek 的返回值也需要检查。我假设fp 是一个有效的文件指针,并且在打开文件时已经检查了它的有效性。

由于您正在读取每个浮点数并打印出来,因此您可能不需要将其存储在数组缓冲区中。

【讨论】:

    【解决方案2】:

    就像在您的代码中一样,您在buffer 的末尾读取了一个元素。因为有效元素的索引从 0end_time - 1 所以立即修复您的代码是

    while ((i < end_time) && (fread(buffer, sizeof(float), 1, fp) == 1))
    {
        printf("%d\t%.2f\n", i, buffer[i]);
        i += 1;
    }
    

    注意:不要尝试printf("%d\t%.2f\n", i, buffer[i++]); 或类似的,因为它是未定义的行为。

    【讨论】:

    • 原来崩溃是由数组引起的,它太大了。我现在有一个数组,一次只存储一个值,并在循环中返回 fread。工作正常,直到第 4096 个样本,它只是挂在第 4095 个中的任何值。有什么想法吗?
    • 为什么fread() 回到循环中?你必须检查它的返回值。也许您的平台上的堆栈太小了。
    猜你喜欢
    • 2013-07-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 2015-06-27
    • 2015-04-23
    相关资源
    最近更新 更多