【问题标题】:Reading Binary Files in C [closed]在 C 中读取二进制文件 [关闭]
【发布时间】:2012-11-26 21:33:28
【问题描述】:

假设用这个函数原型编写了一个二进制文件(需要打开才能读取):

void writeBinaryFile ( char *fileName , char *comment , int numberOfDoubles , double *doubles , int numberOfInts , int *ints )

(有关此功能的更多详细信息可以在下面的粘贴中找到)

...

我写的代码只获取了.bin文件的第一个字母...

这是我的功能:

void readBinaryFile(char *fileName)
{
        FILE *fp;
        char *ptr;
        double *ptr1;
        int *ptr2;
        ptr=(char*)malloc(sizeof(char)*5);
        ptr1=(double*)malloc(sizeof(double)*6);
        ptr2=(int*)malloc(sizeof(int)*6);

        fp=fopen ( fileName , "rb" ) ;
        fread(ptr,sizeof(char),11,fp);
        while(*ptr!='\0')
        {
            printf("%c",*ptr);
            ptr++;

        }
        fclose(fp);
}

我在这里缺少什么?我需要阅读的不仅仅是 .bin 文件中的 first 字符。

一如既往地感谢您的帮助。谢谢!

如果有人需要有条理的完整代码,这里是粘贴:

http://pastebin.com/66jZwfUD

【问题讨论】:

  • 我注意到您将 11 个字节读入分配给 5 个字节的空间中。那肯定不好。
  • 这么多问题......文件实际上包含什么? fread() 返回什么?您发送给printf() 的字符是否可打印?如果文件是二进制文件,是否可能第二个字节只是0,所以您停止尝试打印字符?
  • (1) 没有 API 返回代码检查根本,(2) 三个不同的内存泄漏,(3) 对 while 循环没有长度限制以防止进入未分配的堆内存。 (4) 将 11 个字节读入 5 个字节宽的分配中 = 堆损坏几乎没有保证。我敢肯定还有其他人,但这些都是在前 60 秒内被发现的。
  • 这确实是另一个问题,您将得到的最佳答案是:“您的代码毫无意义。您需要学习 C。”
  • 另外,你在while 和printf() 中将二进制文件作为C 字符串处理(它真的可以由printf 和%c 打印吗?)。二进制文件可以有很多 0,这样的 0 并不意味着文件/字符串的结尾。我相信你需要写这个而不是:int n = fread(..); int i = 0; while(i < n) { /* do something .. */ i++;}

标签: c file io binary


【解决方案1】:
void readBinaryFile(char *fileName)
{
    FILE *fp;
    char *ptr;
    double *ptr1;
    int *ptr2;

    ptr=(char*)malloc(sizeof(char)*5);
    ptr1=(double*)malloc(sizeof(double)*6);
    ptr2=(int*)malloc(sizeof(int)*6);

不要在 C 中转换 malloc 的返回值。它会隐藏错误。

    fp=fopen ( fileName , "rb" ) ;

你需要在这里检查错误。

    fread(ptr,sizeof(char),11,fp);

您为 ptr 分配了 5 个字节,现在您正在读取 11。您还应该检查 fread 的返回值。

    while(*ptr!='\0')
    {
        printf("%c",*ptr);
        ptr++;

    }

没有什么可以阻止这个循环超出分配空间的末尾。

    fclose(fp);
}

现在,您分配的所有内存都泄漏了,您读入的所有数据都丢失了,因为当您返回时指针超出范围。

【讨论】:

  • 如果你不遵守 C99 中所有函数必须在使用前声明的情况,从 malloc 中转换返回只会隐藏错误。然后错误是您没有使用 C99。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 2011-09-03
  • 2016-01-15
  • 1970-01-01
  • 2012-04-29
相关资源
最近更新 更多