菜鸟关于fread()函数读取结构体的问题
这是一个读入电脑里二进制文件的程序,然后把文件里的数据存入一个结构体中,再把其中的元素按一定顺序打印出来。二进制文件的存储方式是一个char一个int这样,代码如下:
- C/C++ code
#include "stdafx.h"#include <stdlib.h>struct lyrics{ char character; int order;}lyc[2506],temp;int _tmain(int argc, _TCHAR* argv[]){ FILE *fp; int i,j,k; if((fp=fopen("d:\\a\\Encode2.da","rb"))==NULL){ printf("file open error.\n"); exit(0); } for(i=0;i<2507;i++){ fread(&lyc[i].character,1,1,fp); //主要是这里 fread(&lyc[i].order,4,1,fp); } for(j=0;j<i-1;j++){ for(k=j;k<i;k++){ if(lyc[k].order<lyc[j].order){ temp=lyc[k]; lyc[k]=lyc[j]; lyc[j]=temp; } } } for(j=0;j<i;j++) printf("%c",lyc[j].character); printf("\n"); fclose(fp); return 0;}
这样可以成功读取没问题,但是换成下面这种方式,整体读入这个结构体,在输出的时候就会成为一堆乱码,为什么呢?
- C/C++ code
for(i=0;i<2507;i++){ fread(&lyc[i],sizeof(struct lyrics),1,fp);}
但是我看很多程序是可以直接这样整体读取一个结构体的。
[解决办法]
内存对齐的问题,char后面填充了3个空白字节导致错位了
[解决办法]