C freads函数返回错误的文件二进制数据

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

我用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",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]);
}