【问题标题】:Read binary file, save in buffer, print out content of buffer读取二进制文件,存入缓冲区,打印出缓冲区内容
【发布时间】:2013-05-20 07:00:36
【问题描述】:

我有一个大问题需要解决,然后才能继续我的程序。

我必须打开一个二进制文件,读取它的内容,将内容保存到缓冲区中,用 malloc 在堆上分配空间,关闭文件,最后 printf(.bin 文件的内容)。我走了这么远(关闭文件还没有实现):

void executeFile(char *path){
    FILE *fp; /*filepointer*/
    size_t size; /*filesize*/
    unsigned int buffer []; /*buffer*/

    fp = fopen(path,"rb"); /*open file*/
    fseek(fp, 0, SEEK_END); 
    size = ftell(fp);         /*calc the size needed*/
    fseek(fp, 0, SEEK_SET); 
    buffer = malloc(size);  /*allocalte space on heap*/

    if (fp == NULL){ /*ERROR detection if file == empty*/
        printf("Error: There was an Error reading the file %s \n", path);           
        exit(1);
    }
    else if (fread(&buffer, sizeof(unsigned int), size, fp) != size){ /* if count of read bytes != calculated size of .bin file -> ERROR*/
        printf("Error: There was an Error reading the file %s - %d\n", path, r);
        exit(1);
    }else{int i;
        for(i=0; i<size;i++){       
            printf("%x", buffer[i]);
        }
    }
}

我想我弄乱了缓冲区,我不确定我是否正确读取了 .bin 文件,因为我无法使用 printf("%x", buffer[i]) 打印它

希望大家帮忙

来自德国的问候:)

【问题讨论】:

  • size 设置在哪里?您已将其注释掉。
  • 仅当事情无法完美(例如,现在)的情况下,您可能希望考虑 检查您调用的函数的返回值fopen()malloc()fseek().. 没有被检查,虽然你最终会检查 fp == NULL,但只有在你盲目地检查 fseek() 之后,NULL 检查似乎是一个文件空检查(这也不正确)而不是打开失败。 阅读库文档
  • 每次事故评论size out->已修复
  • 我开始写一个详细的答案,但只是这样做:(1)​​检查返回值,(2)将缓冲区基本类型更改为unsigned char *buffer;。 (3) 修复fread()调用将buffer作为第一个参数(不是&amp;buffer),sizeof(buffer[0])作为第二个参数。最后(4)用fclose()关闭你的文件,用free()释放你的缓冲区。在进入我留给你的阅读和打印之前,可以选择检查size == 0
  • 另请注意,fstat() 可能比多次fseek() 调用更适合确定文件大小...

标签: c malloc buffer binaryfiles fread


【解决方案1】:

建议的更改:

  1. 将缓冲区更改为char(字节),因为ftell() 将以字节为单位报告大小(char),而malloc() 也使用字节大小。

    无符号整数缓冲区 []; /缓冲区/

unsigned char *buffer; /*buffer*/
  1. [编辑] 2021:省略强制转换
    2) 这没关系,大小是字节,缓冲区指向字节,但可以显式强制转换

    缓冲区 = malloc(大小); /在堆上分配空间/

buffer = (unsigned char *) malloc(size);  /*allocate space on heap*/
/* or for those who recommend no casting on malloc() */
buffer = malloc(size);  /*allocate space on heap*/
  1. 将第二个参数从sizeof(unsigned int) 更改为sizeof *buffer,即1。

    else if (fread(buffer, sizeof(unsigned int), size, fp) != size){

else if (fread(buffer, sizeof *buffer, size, fp) != size){ 
  1. "%x" 更改为 "%02x" 否则单个十六进制数字会混淆输出。例如。 “1234”是四个字节还是两个字节?

    printf("%x", 缓冲区[i]);

printf("%02x", buffer[i]);
  1. 您在函数结束时的清理可能包括

    fclose(fp); 空闲(缓冲区);

【讨论】:

  • 你不能在函数内部使用空数组绑定(在参数列表中可以)。而且您不能像malloc() 那样分配给数组。它必须是unsigned int *buffer;
  • 是的,他在抱怨空数组绑定......程序不知道缓冲区必须有多大,因为它不知道文件的大小......
  • @Jonathan Leffler:将解决方案从“unsigned int buffer[]”更正为“unsigned char *buffer”。
  • @luizfls 为什么是的!修改了代码。
猜你喜欢
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
相关资源
最近更新 更多