C语言文件读写结构体里面的数据怎样存到磁盘文件上

作者&投稿:时闸 (若有异议请与网页底部的电邮联系)
c语言怎么把一个结构体存入文件,在把文件读取怎~

C语言,要将结构体中的数据存到磁盘上需要使用与文件操作相关的库函数。
首先要使用文件打开函数fopen()。
fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式) 其中,“文件指针名”必须是被说明为FILE 类型的指针变量,“文件名”是被打开文件的文件名。 “使用文件方式”是指文件的类型和操作要求。“文件名”是字符串常量或字符串数组。
其次,使用文件读写函数读取文件。
在C语言中提供了多种文件读写的函数:
·字符读写函数 :fgetc和fputc
·字符串读写函数:fgets和fputs
·数据块读写函数:freed和fwrite
·格式化读写函数:fscanf和fprinf
最后,在文件读取结束要使用文件关闭函数fclose()关闭文件。

下面使用格式化读写函数fscanf和fprintf实现对文件A.txt(各项信息以空格分割)的读取,并存入结构体数组a中,并将它的信息以新的格式(用制表符分割各项信息)写入B.txt,实现对A.txt的处理。

C语言源程序如下所示:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

#include
#include
#include
typedef struct student{
char name[32];
int no;
char sex[16];
float score;
} stu;

int main(int argc, char* argv[])
{
//打开文件
FILE * r=fopen("A.txt","r");
assert(r!=NULL);
FILE * w=fopen("B.txt","w");
assert(w!=NULL);

//读写文件
stu a[128];
int i=0;
while(fscanf(r,"%s%d%s%f",a[i].name,&a[i].no,a[i].sex,&a[i].score)!=EOF)
{
printf("%s%d%s%g
",a[i].name,a[i].no,a[i].sex,a[i].score);//输出到显示器屏幕
fprintf(w,"%s%d%s%g
",a[i].name,a[i].no,a[i].sex,a[i].score);//输出到文件B.txt
i++;
}

//关闭文件
fclose(r);
fclose(w);

system("pause");
return 0;
}

最好用2进制方法打开文件,用fwrite 写文件。读时也用用2进制方法打开文件,用fread读.
这样,写的时候按整个结构写,读也按整个结构读,字符串有空白也没关系。
FILE *fp;

fp=fopen("my.dat","wb");
fwrite(&stu,sizeof(stu),1,fp); // 写1个结构
for (i=0;i<10;i++) fwrite(&student[i],sizeof(student),1,fp); // 写10个结构
fclose(fp);

fp=fopen("my.dat","rb");
fread(&stu,sizeof(stu),1,fp); // 读1个结构
for (i=0;i<10;i++) fread(&student[i],sizeof(student),1,fp); // 读 10个结构
fclose(fp);

1、首先打开VC++6.0。

2、选择文件,新建。

3、选择C++ source file 新建一个空白文档。

4、首先声明头文件,#include<stdio.h>。

5、主函数,定义变量main( ){    FILE *fp;    int i; 需要一个结构体,struct rec{ /*定义结构体类型*/ char id[10];。

6、主要代码if( (fp=fopen("d:\\infile.txt","w"))==NULL ) /*以文本只写方式打开文件*/   {

printf("cannot open file"); exit(1); }。



C语言,要将结构体中的数据存到磁盘上需要使用与文件操作相关的库函数。

首先要使用文件打开函数fopen()。

fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式) 其中,“文件指针名”必须是被说明为FILE 类型的指针变量,“文件名”是被打开文件的文件名。 “使用文件方式”是指文件的类型和操作要求。“文件名”是字符串常量或字符串数组。

其次,使用文件读写函数读取文件。

在C语言中提供了多种文件读写的函数: 

·字符读写函数 :fgetc和fputc

·字符串读写函数:fgets和fputs

·数据块读写函数:freed和fwrite

·格式化读写函数:fscanf和fprinf

最后,在文件读取结束要使用文件关闭函数fclose()关闭文件。


下面使用格式化读写函数fscanf和fprintf实现对文件A.txt(各项信息以空格分割)的读取,并存入结构体数组a中,并将它的信息以新的格式(用制表符分割各项信息)写入B.txt,实现对A.txt的处理。


C语言源程序如下所示:

#include <stdio.h>
#include <stdlib.h>
#include  <assert.h>
typedef struct student{
        char name[32];
        int  no;
        char sex[16];
        float score;
} stu;
  
int main(int argc, char* argv[])
{
    //打开文件 
    FILE * r=fopen("A.txt","r");
    assert(r!=NULL);
    FILE * w=fopen("B.txt","w");
    assert(w!=NULL);
      
    //读写文件 
    stu a[128];
    int i=0;
    while(fscanf(r,"%s%d%s%f",a[i].name,&a[i].no,a[i].sex,&a[i].score)!=EOF)
    {
         printf("%s%d%s%g
",a[i].name,a[i].no,a[i].sex,a[i].score);//输出到显示器屏幕 
         fprintf(w,"%s%d%s%g
",a[i].name,a[i].no,a[i].sex,a[i].score);//输出到文件B.txt 
         i++;
    }  
      
    //关闭文件 
    fclose(r);
    fclose(w);
      
    system("pause");
    return 0;
}

编译运行后的结果如下:

   



结构体存储到磁盘文件,一般有两种方法,各有优劣,需要依照实际需求来选择。

假定结构体格式为

struct test
{
    int a;
    float b;
};

1 以二进制方式存储。

直接以二进制方式存储,参考代码如下:

#include <stdio.h>
int main()
{
    struct test v = {1, 2.3};
    FILE *fp;
    fp = fopen("save.bin", "wb"); //存储于save.bin中,注意要以二进制模式打开。
    if(fp == NULL)return -1; // 打开文件失败。
    fwrite(&v, sizeof(v), 1, fp); //写入文件。
    fclose(fp);//关闭文件。
    
    return 0;
}

当需要读取的时候,按照类似的流程,通过fread读取即可。

该操作优势为:

    a 代码简单。

    b 存储的数据文件大小固定,就是结构体占用内存空间的整数倍。这样在读的时候就可以根据文件的大小直接判断出一共存储了多少个数据。

缺点为:

    a 存储的是二进制方式,打开后不可读(大部分时候会是乱码)。

需要注意一点,当结构体中有指针类型时,所有指针不可以直接写入,而是要依照每个指针展开写入,即写入指针指向的地址内容,而不是写入指针本身的值。这种情况下,读取的时候也需要重新分配指针,并读取对应的数据。


2 以文本方式写入。

通过fprintf函数,对每个值以可读的方式,格式化输出到文本文件中。类似于printf的操作,只不过目标由标准输出转向文件。

参考代码如下:

#include <stdio.h>
int main()
{
    struct test v = {1, 2.3};
    FILE *fp;
    fp = fopen("save.txt", "w"); //存储于save.txt中,注意要以文本模式打开,也就是不带b的模式。
    if(fp == NULL)return -1; // 打开文件失败。
    fprintf(fp, "%d %f", v.a, v.b); //写入文件。
    fclose(fp);//关闭文件。
    
    return 0;
}

读取的时候用fscanf依次读取即可。

这种方法的好处是:

    a 获得的文件是可读的,打开后可以很清楚的看到每个结构体的值。比如例子中的文件最终存储的是

1 2.300000

缺点为:

    a 代码量偏大,如果结构体中有数量较多的元素,那么需要逐个写输出的格式和语句,可见工作量会相当大。

    b 存储的文件大小不确定,可能比二进制存储时大,也可能更小,不同结构体数值占用也不同。比如例子中的结构体,二进制存储的时候是8个字节,文本存储的时候是10个字节。而如果赋值v={-1234567,1234.1};那么文件中会存储

-1234567 1234.100000

这样文件就会占用20个字节。



使用文件操作函数
fread
fwrite

数据块读写函数:fread、fwrite。


C语言怎么把文件数据导入赋值给结构体变量,然后全局使用这个变量?_百度...
您好,很高兴回答您的问题。对于您提出的问题,只要首先建立对应文件,注意c语言对文件格式有很高的要求。然后建立全局的结构体变量,再使用fopen函数打开前面的文件,使用fscanf函数逐一读取文件中的内容给对应的结构体变量即可。

C语言结构体如何存入文件
最好用2进制方法打开文件,用fwrite 写文件。读时也用用2进制方法打开文件,用fread读.这样,写的时候按整个结构写,读也按整个结构读,字符串有空白也没关系。FILE *fp;fp=fopen("my.dat","wb");fwrite(&stu,sizeof(stu),1,fp); \/\/ 写1个结构 for (i=0;i<10;i++) fwrite(&stud...

关于C语言中,如何能够知道文件中,结构体数据块的个数。
可以通过ReadFile函数读取你的文件,它有一个参数就是返回实际读了多少个字节的数据,然后除以你的sizeof(struct),就可以了 试试看

C语言文件操作中输出结构体乱码的问题
你的out.txt的内容是你自己打进去的,不是用fwrite写进去的,而且你结构中还包含了,什么的,如果你的内容是用fwrite写进去的就可以用fread读了,它们是要配合使用的。

C语言:从一个二进制文件中读入结构体数据,并把结构体数据显示在终端屏幕...
FILE *f sizeof(struct rec)r.num,r.total

c++中fopen函数读文件怎么用文件数据?
FILE是一个由系统定义的结构体(定义在stdio.h中),可以存放文件的相关信息。\\x0d\\x0a文件的打开(fopen函数)\\x0d\\x0a 文件的操作过程一般为:打开 => 读\/写 => 关闭。\\x0d\\x0afopen函数的原型如下:\\x0d\\x0a FILE* fopen(const char* filename, const char* mode); \\x0d\\...

C语言文件内储存结构体,如何在不知道文件内有多少组数据的情况下将数据...
某结构体t 打开文件,每次读sizeof(t)大小.检测EOF标志.

文件指针 跟 指向结构体的指针 有什么区别?(C语言)
FILE是C语言中默认用来表示文件信息的结构体,在stdio.h中有定义,具体内容和运行环境(平台)相关。当打开一个文件时,文件内容由库函数记录到一个FILE结构体中,而用户可以通过库函数返回的struct FILE*类型的指针对文件进行间接操作。此外FILE结构体中含有文件的读写指针(LS误把这个当作文件指针了),...

C语言-文件操作 如何把某行数据分两部分分别存在两个不同的结构体中
读取的时候 用fscanf 后续的变量 分别用不同结构体的成员就好 比如 两个整型, 两个结构体变量分别是a.a和b.a 那么 fscanf(fp, "%d%d",&a.a, &b.a);这样就可以了。

C语言 如何读取xml文件中的数据并存入一个结构体中
一般是用第三方比如TinyXml,或者你自己实现。

河西区13027461490: C语言中,将多个结构体数据写到一个文件中,应该如何读取? -
左丘蓝华阳: C语言把一个结构体数组写入文件分三步:1、以二进制写方式(wb)打开文件2、调用写入函数fwrite()将结构体数据写入文件3、关闭文件指针 相应的,读文件也要与之匹配:1、以二进制读方式(rb)打开文件2、调用读文件函数fread()...

河西区13027461490: 如何用C语言读取txt文件中的数据到结构体数组中 -
左丘蓝华阳: 1、在vscode里面添加了Python文件和用于读取的文本文件. 2、然后在txt文件写上一些内容用于待会的内容读取,随便写上即可. 3、此外,我们还必须要导入os文件,这样才可调用os中的一些文件操作方法. 4、然后打开要进行读取内容的文件,并且把读取到的内容数据复制给了变量a. 5、然后把变量a打印即可把内容给展现出来,方便查阅了. 6、接着运行jy.py文件,这样就会开始读取,打印内容. 7、可以看到文件的内容真的被读取到了.

河西区13027461490: 怎样将文件里的数据读取到相对应的结构数组中 -
左丘蓝华阳: 使用for循环语句+文件操作函数即可文件中数据读取并存到数组中. 1、C语言标准库提供了一系列文件操作函数.文件操作函数一般以f+单词的形式来命名(f是file的简写),其声明位于stdio.h头文件当中.例如:fopen、fclose函数用于文件打开与关闭

河西区13027461490: C语言中,用fscanf如何从文件中读取结构体数据 -
左丘蓝华阳: 用fscanf似乎不是那么简单,不过你要定制数据文件的格式: 比如: struct stu {int id;char name[N]; } 你的文件a.dat: 10 //学生总数,读一个后面来循环 1 //fscanf(fp, "%d", &stu[i].id); 小明 //fscanf(fp, "%s", &stu[i].name); 2 小王 ..如此往复...

河西区13027461490: c语言中怎么把一文件中的内容读到一结构体中 -
左丘蓝华阳: 如果文件中的数据符合定义的数据结构,就使用读随机文件的办法读 如果不符合,就按各个字段分别读入

河西区13027461490: C语言中怎么将文件的数据读入到结构体数组中 比如 做一个字典 将中英词写在一个文件里 然后用一个结构体
左丘蓝华阳: 这个就要看你的数据组织了,比如说一个结构体typedef struct { int index; char *word; char *translate;}dictionary;那么你文件里面的也就要按这个顺序排列,然后再用dictionary dc;fscanf(fp,"%d%s%s",&amp;dc.index,dc.word,dc.translate);只要按顺序就能正确读取出来的.

河西区13027461490: c语言将文本文件读取到结构体中 -
左丘蓝华阳: 呵呵,满意的话要给我追加分哦!那两个例子都是我自己给你写的. 1. #include"stdio.h" #include"stdlib.h" main() {FILE *fp;char s[100];if((fp=fopen("f:\\score.txt","a"))==NULL){printf("Can't open destination file!\n");exit(0);}...

河西区13027461490: C语言如何从文件中读结构体数据并形成链表 -
左丘蓝华阳: 建议你看一下流文件的读取及存储.这个例子是c++的.你凑合看下吧.#include#include#includeusing namespace std;void main(){int nNum[3] = {20, 30, 40};ofstream outfile("student.txt", ios::binary);//二进制写.保存txt文档for (int i=0; i

河西区13027461490: C语言文件读写结构体里面的数据怎样存到磁盘文件上 -
左丘蓝华阳: 1、首先打开VC++6.0. 2、选择文件,新建. 3、选择C++ source file 新建一个空白文档. 4、首先声明头文件,#include<stdio.h>. 5、主函数,定义变量main( ){ FILE *fp; int i; 需要一个结构体,struct rec{ /*定义结构体类型*/ char id[10];. 6、主要代码if( (fp=fopen("d:\\infile.txt","w"))==NULL ) /*以文本只写方式打开文件*/ { printf("cannot open file"); exit(1); }.

河西区13027461490: 在c语言中如何将结构体数据写入文本文件 -
左丘蓝华阳: struct BOX{char a;int b;int c;};//保存BOX box1 = { 'C', 123, 234 };FILE *f=fopen("d:/a.txt", "w");if (f){fwrite(&box1, sizeof(BOX), 1, f);fclose(f);}//读取BOX box2;FILE *r = fopen("d:/a.txt", "r");if (r){fread(&box2, sizeof(BOX), 1, r);fclose(r);printf("%c %d %d\n", box2.a, box2.b, box2.c);}

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网