C freads函数返回错误的文件二进制数据
我用c编写了一个二进制文件,并用xxd检查了它,输出如下:C freads函数返回错误的文件二进制数据,c,fread,C,Fread,我用c编写了一个二进制文件,并用xxd检查了它,输出如下: 6161 6161 现在我的代码是: FILE * read; int * filebytes; read = fopen("data/myfile","rb"); fread(filebytes,4,4,read); for(int x = 0; x < var; x++){ printf("%x\n",fileb
6161 6161
现在我的代码是:
FILE * read;
int * filebytes;
read = fopen("data/myfile","rb");
fread(filebytes,4,4,read);
for(int x = 0; x < var; x++){
printf("%x\n",filebytes[x]);
}
fclose(read);
现在更奇怪的是,如果我现在不读出4乘以32位,而是5乘以,那么3行的最后一个字节不是71而是75,读出6乘以32位79,依此类推(每次加4)。我想不出为什么每次在我阅读的第三单元都会发生这种情况。
我想知道如何将一个文件读成32段,而不会对代码进行奇怪的更改。
对每种类型的帮助都感到高兴。“man fread”说:
#包括
大小fread(无效*BUF、大小大小、大小计数、文件*FP);
其中:
BUF-指向输出内存的指针
SIZE—1“元素”中的字节数
COUNT—要读取的“元素”数
FP-要从中读取的打开文件指针
这里有SIZE=4
,COUNT=4
,所以您试图读取16个字节
但您正在读取由filebytes
指向的内存位置,但这目前只是一个随机数,因此可能指向内存中的任何位置。
因此,您的fread()命令可以:
- 最终崩溃,因为内存位置“filebytes”可能指向地址空间之外
- 最后指向其他代码稍后将更改的内存(如您的情况)
- 纯粹是出于偶然,代码的任何其他部分都不会使用它,而且是出于运气
filebytes需要指向有效内存,例如:
在堆上:filebytes=(int*)malloc(16)
或者在堆栈上,通过使filebytes成为函数的本地数组,如:
int filebytes[16]
请注意,sizeof(int)可能因计算机/体系结构而异,因此“int filebytes[16]将分配至少16个字节(因为int将至少为1个字节,通常至少为2个)
(还请注意,您的示例中没有定义“var”-这应该定义。但即使定义了var,这也可能没有意义:
for(int x = 0; x < var; x++){
printf("%x\n",filebytes[x]);
}
for(int x=0;x
因为你还没说你想做什么。
例如,输入文件中有多少字节表示“一个整数”?理论上可以是任何数字。
如果说4个字节代表“一个整数”,那么最高有效字节在前,还是最低有效字节在后?
请注意,您的机器可能是大端机或小端机,因此,例如,如果您在小端机上运行(最低有效字节优先),但您的文件先有最高有效字节,然后直接加载到整数数组将不会给出正确的答案。或者,即使它们相同,如果以后在不同的计算机上运行相同的程序(具有相反的端点),它也将开始中断
您需要决定:
- 文件中的整数有多少字节
- 它们是最高有效字节第一,还是最低有效字节第一?
然后,您可以加载到一个“unsigned char”数组中,然后从中手动构建整数(无论机器的endian是什么,这都会起作用)
啊,顺便说一句,将int改为uint32不会改变任何东西。filebytes
-您在哪里分配了内存?您正在取消对未初始化指针的引用。这是未定义的行为。您也在玩火,将fread
项大小硬设为4,这在某些平台上是完全错误的。您应该编译pro打开警告标志的gram。-Wall-Wextra
带有gcc或clang,/W4
带有MSVC。另请参阅。
for(int x = 0; x < var; x++){
printf("%x\n",filebytes[x]);
}