C语言对结构体文件的读取

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言对结构体文件的读取相关的知识,希望对你有一定的参考价值。

现在只知道一个文件存取数据的时候是用的这个结构体(他的两成员变量都是指针类型的. ) typedef struct TEST char* ch; char* cha; TESTFEI; 现在要读取这个文件中的数据,应该怎么办呢?

参考技术A C语言中对结构体数据格式文件进行读取时,必须以二进制格式打开文件,然后按结构体类型变量内存块方式进行数据读取,相关读数据命令为fread()。
函数说明:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
从stream文件流中,读取nmemb个size大小的数据块到ptr所指的内存buf中,返回读取到的有效数据块数。
如,有如下结构体定义:
typedef struct TEST

int num;
double score;
STRTEST;
STRTEST data ;
FILE *fp = fopen("file.dat", "rb" ) ; //按二进制格式打开文件
int n=fread( &data, sizeof(STRTEST), 1, fp ); //读取一个数据块到变量data中。
注意,当结构体中定义的变量有指针类型时,在存储数据时,就不能按结构体进行存储了。
因为,指针变量中存储的是内存地址,而程序在不同环境运行时,所使用的内存地址是不同的,只存储内存地址,不能把真正的数据保存下来,所以,即使是正确读取到文件内容,也不能得到当时的结构体内存数据。因而,在存储结构体数据时,要根据结构体类型变量特点采用正确的方法进行存储,才能正确的读取。

c语言怎么用文件保存和读取 结构体数组/

txt

#include <stdio.h>
int main()

struct test
int a;
char s[10] ;
double d ;
tr[3] , tw[3] =
1,"hello1" , 100 ,
2,"hello2" , 90,
3,"hello3", 200
; //定义一个结构体数组

FILE *fp ;
fp=fopen("struct.dat" , "wb" );
if ( fp == NULL )
return -1 ;
fwrite( (char*)tw , sizeof(struct test), 3 , fp ); //将数组写入文件
fclose(fp);
//以上完成写操作
fp=fopen("struct.dat" , "rb" );
if ( fp == NULL )
return -1 ;
fread( (char*)tr , sizeof(struct test), 3 , fp ); //从文件中读三个结构体的数据,也可以一个一个的读
fclose(fp);
//输出读到的数据

int i;
for(i=0;i<3;i++ )
printf("%d %s %lf\n" , tr[i].a , tr[i].s, tr[i].d );


return 0;
参考技术A 结构体数据的保存通常以二进制形式进行.
FILE *fw = fopen(filename,"wb");
写函数是fwrite(&structdata,sizeof(structdata),1,fw);
FILE *fr = fopen(filename,"rb");
读函数是fread(*structdata,sizeof(structdata),1,fr);
每次读写都是一个完整的结构体数据。本回答被提问者采纳
参考技术B 文本方式读写
#include "stdio.h"
#include <stdlib.h>
#define SIZE 5
struct student
char ID[10];
char Name[12];
int Score;
stud[SIZE];

void read()

FILE *fp;
int i;

if((fp=fopen("score.txt","rt"))==NULL)

printf("cannot open file\n");
return;

for(i=0;i<SIZE;i++)
fscanf(fp,"%s %s %d\n",stud[i].ID,stud[i].Name,&stud[i].Score);
fclose(fp);


void save()

FILE *fp;
int i;
if((fp=fopen("score.txt","wt"))==NULL)

printf("cannot open file\n");
return;

for(i=0;i<SIZE;i++)
fprintf(fp,"%-10s%-12s%d\n",stud[i].ID,stud[i].Name,stud[i].Score);
fclose(fp);


void main()

read();
save();
追问

&stud[i].Score 为什么它要加个&

追答

因为是整数(以及浮点数)

参考技术C fread/fwrite,里面是读取/写入块,一个块多少字节,你可以把一个块想象成为一个结构,数量就是数组

以上是关于C语言对结构体文件的读取的主要内容,如果未能解决你的问题,请参考以下文章

C 语言文件操作 ( 将结构体写出到文件中并读取结构体数据 | 将结构体数组写出到文件中并读取结构体数组数据 )

c语言怎么用文件保存和读取 结构体数组/

C 语言文件操作 ( 学生管理系统 | 命令行接收数据填充结构体 | 结构体写出到文件中 | 查询文件中的结构体数据 )

C#中怎么读取Struct(结构体)文件!!!!??救救我!!!!

C语言 结构体指针字符 二进制文件写入和读取

C 语言文件操作 ( 读取文件中的结构体数组 | feof 函数使用注意事项 )