【发布时间】: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 检查似乎是一个文件空检查(这也不正确)而不是打开失败。 阅读库文档。 -
每次事故评论
sizeout->已修复 -
我开始写一个详细的答案,但只是这样做:(1)检查返回值,(2)将缓冲区基本类型更改为
unsigned char *buffer;。 (3) 修复fread()调用将buffer作为第一个参数(不是&buffer),sizeof(buffer[0])作为第二个参数。最后(4)用fclose()关闭你的文件,用free()释放你的缓冲区。在进入我留给你的阅读和打印之前,可以选择检查size == 0。 -
另请注意,
fstat()可能比多次fseek()调用更适合确定文件大小...
标签: c malloc buffer binaryfiles fread