C语言怎么读取二进制文件中的数据放到一个300×300的二维数组里面

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言怎么读取二进制文件中的数据放到一个300×300的二维数组里面相关的知识,希望对你有一定的参考价值。

用 fopen 打开文件时 设 "rb" --用二进制方法打开,用于读
用 fread 读取数据,函数原型是:
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
各参数意义,请查编译器帮助文件,这里就不开课了。
300×300 的数组需要的内存量较大,可动态分配,或用 全局量。
下面是程序例子。先建了一个2进制文件,里面存了300*300个float型数据。然后读这个文件里的内容。
#include<stdio.h>
float a[300][300];
int main()

FILE *fin, *fout;
int i,j;
for (j=0;j<300;j++) for (i=0;i<300;i++) a[j][i]=j*100+i;
fout=fopen("a.txt","wb");
for (j=0;j<300;j++)
fwrite(&a[j][0],sizeof(float),300,fout);
fclose(fout);
for (j=0;j<300;j++) for (i=0;i<300;i++) a[j][i]=0; //数组清零
fin=fopen("a.txt","rb"); //打开输入文件
for (j=0;j<300;j++)
fread(&a[j][0],sizeof(float),300,fin); //读文件
fclose(fin); //关闭文件
// 下面输出文件的左上角100个数据,和右下角100个数据供检查参考。
for (j=0;j<10;j++)
for (i=0;i<10;i++)printf("%3.0f ",a[j][i]); printf("\n");
printf("\n");
for (j=290;j<300;j++)
for (i=290;i<300;i++)printf("%g ",a[j][i]); printf("\n");
return 0;
参考技术A #include<stdio.h>
#include<stdlib.h>
#define N 300
#define M 300
void main()  FILE *fp; int a[N][M],i.j;
  if ( fp=fopen("data.dat","rb") ) 
    for ( i=0;i<N;i++ ) fread(a[i],sizeof(int),M,fp);
    fclose(fp);
    for ( i=0;i<N;i++,printf("\\n") ) for ( j=0;j<M;j++ ) printf("%d ",a[i][j]);
   else printf("无法打开数据文件。\\n");

C语言将数据写入文件,读取出现二次读取

出现的问题就在我画红线的地方。
*****以写的方式保存数据到文件的函数【原数据将被覆盖】*****/
int save(int n) //保存函数,保存n个记录

FILE *fp;
int i;
if((fp=fopen("zhouhao.txt","wb"))==NULL)//以二进制写的方式打开,在此前的记录被覆盖

printf("无法打开文件!\n任意键退出程序... ...\n");
getch(); //预防闪屏
return 0;

for(i=0;i<n;i++)
if(per[i].f_num!=0) //在后面的del()函数中通过将stu[i].ave=0来表示该记录被删除了
if(fwrite(&per[i],sizeof(struct person),1,fp)!=1)//开始写入文件
printf("文件写入发生错误\n");
fclose(fp);
return 0; // 注意下这个地方 ,我只是随便赋的值,只是为了消除一个警告

/***【加载记录或可以计算记录个数的函数】***/
int load()

FILE *fp;
int i;
if((fp=fopen("zhouhao.txt","rb"))==NULL) //以二进制读的方式打开

printf("无法打开文件!\n任意键退出程序... ...\n"); //显示不能打开文件的信息
getch(); //预防闪屏
return 0;

for(i=0;!feof(fp);i++)
fread(&per[i],sizeof(struct person),1,fp); //将文件数据读入学生结构体
fclose(fp);
return(i-1); //返回目前总的记录个数,注意是i-1

大神给点建议,是哪儿出现问题了,如果要源程序的话我也可以共享!
person结构体
typedef struct person

char number[4]; //序号
char ymd[10]; //来访日期
char v_name[10]; //来访人姓名
char cre_name[10]; //来访人证件名
char c_num[18]; //来访人证件编号
char bv_name[10]; //被访人姓名
double f_num; //被访人楼号
char hm_start[5]; //来访时间
char hm_leave[5]; //离开时间
char desc[20]; //备注
PER;
PER per[N]; //定义一个外部结构体变量

不要用feof在循环里判断,在读到文件最后一个字节时,feof(fp)还是为0值,再试图读文件时,feof(fp)才为非0值来报错,所以会多读一次
用fread的返回结果判断就行了,0就是没数据了

for(i=0;!feof(fp);i++)
    fread(&per[i],sizeof(struct person),1,fp);
改成
i=0;
while (fread(&per[i],sizeof(struct person),1,fp))
    i++;追问

还是不行哎。。大哥,改完以后还是输出这个结果。。。

追答

return(i-1); //返回目前总的记录个数,注意是i-1
不用-1了,直接return i

追问

大哥,不行的,

参考技术A 提供一下你的person结构体,估计变量定义有问题追问

我把person结构体补充到上面了,这边写不下。。。麻烦您咯。。

追答

char ymd[10]; //来访日期 你存储的数据如果是2014/07/02则说明有效数据是10个,而作为一个字符串,应该还要有一位结束符位('\0'),因此,应该改为char ymd[11]; //来访日期,比有效数据多一个才好!
其他地方的字符串也要注意这个问题。
祝进步

追问

大哥还是不对啊,我都改了,依旧是原来的样子

追答

重新保存你的数据文件,再重新读数据才可以!

追问

谢谢咯,还是不行

追答

共享完整代码,你这程序就这两个问题,一个是楼下说的多读了一行空数据,所以出现了2和NULL
另一个,就是你变量定义的问题,导致输出的日期后面有附加数据。

以上是关于C语言怎么读取二进制文件中的数据放到一个300×300的二维数组里面的主要内容,如果未能解决你的问题,请参考以下文章

c语言怎么二进制文件操作?

C语言怎么读取CSV里面的数据?

C语言 读取文件到内存

Go语言文件操作

C语言怎么做到从文件中读取一行数据,然后改变这一行内容

怎样用C语言读取txt文件中的二进制数据并转为一维数组