【发布时间】: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 字符。
一如既往地感谢您的帮助。谢谢!
如果有人需要有条理的完整代码,这里是粘贴:
【问题讨论】:
-
我注意到您将 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++;}