C语言程序设计 利用文件保存数据

1 C文件的有关概念

1.1 什么是文件

在进行C运用程序设计中,主要用到两种文件:
(1)程序文件。包括程序文件(后缀为.c)、目标文件(后缀为.obj)、可执行文件(后缀为.exe)等,用来存放程序的。
(2)数据文件。供程序运行时读入内存的数据。
文件指存储在外部介质上数据的集合。
输入输出是数据传送的过程,输入输出形象地称为流,即输入输出流。流表示了信息从源到目的的流动。

1.2 文件名

文件标识包括三部分:
(1)文件路径。表示文件在外部存储设备中的位置。
(2)文件名主干的命名规则遵循标志符的命名规则。
(3)后缀用来表示文件的性质,一般不超3个字符,如:.doc,.txt…

1.3 文件的分类

数据文件可分为ASCII文件和二进制文件。ASCII文件又称文本(txt)文件。

1.4 文件缓冲区

C语言采用缓冲文件系统处理文件,缓冲文件系统是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区
C编译系统提供了一些标准输入输出函数,用来对文件进行读写。

1.5 文件类型指针

文件类型指针,简称文件指针。
定义FILE结构体类型的信息包含在头文件“stdio.h”中。在程序中可以直接用FILE类型名定义变量。如:

FILE f;//类比int a;

定义一个指向文件型数据的指针变量

FILE *fp;

定义fp为一个指向FILE类型变量的指针变量。使fp指向某一个文件的文件信息区,通过文件信息区中的信息能够访问该文件,即通过文件指针变量能够找到与它相关的文件,将这种指向文件信息区的指针变量称为指向文件的指针变量
指向文件的指针变量是指向内存中的文件信息区的开头。

2 文件的打开和关闭

对文件读写之前应该打开文件,在使用结束之后应关闭该文件。
打开是指为文件建立相应的信息区和文件缓冲区。
关闭是指撤销文件信息区和文件缓冲区。

2.1 用fopen函数打开数据文件

fopen函数的调用方法为

fopen(文件名,使用文件方式);

例如:

fopen("a1","r");

表示要打开名字为“al”的文件, 使用文件的方式为“读入”(r代表read, 即读入) 。fopen函数的返回值是指向al文件的指针(即al文件信息区的起始地址) 。
通常将fopen函数的返回值赋给一个指向文件的指针变量。如:

FILE *fp;
fp=fopen("a1","r");

fp指向了a1文件。
使用文件的方式
在这里插入图片描述
(1)最基本的是最前面的"r"、“w”、"a"三种方式。在其后加“b”表示是二进制文件, 不加“b”的表示是ASCII文件(即文本文件) 。加“+”表示既可读又可写。
(2) 如果不能实现“打开”的任务, fopen函数将会带回一个出错信息。出错的原因可能是用“r”方式打开一个并不存在的文件;磁盘出故障;磁盘已满无法建立新文件等。此时fopen函数将带回一个空指针值NULL(NULL在stdio.h文件中已被定义为0) 。
常用下面的方法打开一个文件:

if((fp=fopen("a1","r"))==NULL)
	{printf("can not open this file\n");
	exit(0);
}

编译系统先检查打开的操作有否出错, 如果有错就在终端上输出“can not open this file”。exit函数的作用是关闭所有文件, 终止正在执行的程序, 待用户检查出错误, 修改后再运行。

2.2 用fclose函数关闭文件

关闭文件用fclose函数,fclose函数形式为:

fclose(文件指针);

例如:

fclose(fp);

前面曾把打开文件(用fopen函数) 时所带回的指针赋给了fp,现在把fp指向的文件关闭,此后fp不再指向该文件。
应该养成在程序终止之前关闭所有文件的习惯,如果不关闭文件可能会丢失数据。
fclose函数也带回一个值, 当顺利地执行了关闭操作, 则返回值为0; 否则返回EOF(一1) 。

3 文件的顺序读取

顺序读写,对文件读写数据的顺序和数据在文件中的物理顺序是一致的。

3.1 向文件读写字符

读写一个字符的函数
在这里插入图片描述
例题:
从键盘输入一些字符,逐个把它们送到磁盘上去,直到用户输入一个“#”为止。
思路:
从键盘输入字符,然后用fputc函数写到磁盘文件。
编写程序:

#include <stdio.h>
#include <stdlib.h>
int  main(){
	FILE *fp;//定义指向文件的指针变量
	char ch,filename[10];//定义字符ch和字符数组filename
	printf("请输入所用的文件名:");
	scanf("%s",filename);//输入文件名
	if((fp=fopen("filename","w"))==NULL)//如果打开时出错,就输出“打不开”信息
	{printf("无法打开此文件\n");
	exit(0);//终止程序
	}
ch=getchar();//ch用来接收在执行scanf语句时最后输入的回车符
printf("请输入一个准备存储到磁盘的字符串(以#结束):");
ch=getchar();//接收从键盘输入的第一个字符
while(ch!='#')//当输入“#”时结束循环
{
	fputc(ch,fp);//磁盘文件输出一个字符
	putchar(ch);//将输入的字符显示在屏幕上
	ch=getchar();//再接受从键盘输入的一个字符
}
fclose(fp);//关闭文件
putchar(10);//向屏幕输出一个换行符,换行的ASCII代码为10
return 0;
}

运行结果:
在这里插入图片描述
程序分析:
(1)本程序采取的方法是由键盘输入文件名。为此设立一个字符数组filename。用来存放文件名。运行时,从键盘输人磁盘文件名“file1.dat”.操作系统就新建立一个磁盘文件file l.c,用来接收程序输出的数据。
(2) 用fopen函数打开一个“只写”的文件(“w”表示只能写人不能从中读数据) , 如果打开成功,丽数的返回值是该文件所建立的信息区的起始地址,把它赋给指针变量fp(fp已定义为指向文件的指针变量)。如果不能成功地打开文件,则在显示器的屏幕上显示“无法打开此文件”, 然后用exit函数终止程序运行。
(3) exit函数是标准C的库函数, 作用是使程序终止,用此函数时在程序的开头应加入stdlib.h头文件。
(4) 用getchar函数接收用户从键盘输人的字符。注意每次只能接收一个字符。现输人准备写人磁盘文件的字符“abc123#”, “#”是用来表示输人的字符串到此结束。
(5)先从键盘读人一个字符,检查它是否“#”?如果是,表示字符串已结束,不执行循环体, 如果不是, 则执行一次循环体,将该字符输出到磁盘文件file1.dat。然后在屏幕上显示出该字符,接着再从键盘读人一个字符。如此反复,直到读人“#"字符为止。这时,程序已将“abc123#”写到以“file1.dat”命名的磁盘文件中了, 同时在屏幕上也显示出了这些字符,以便核对。

3.2 向文件读写一个字符串

通过函数fgets和fputs一次读写一个字符串。
在这里插入图片描述
说明:
(1)用fgets函数可以指定的文件读入一个字符串。如:

fgets(str,n,fp);

其中n为要求得到的字符个数,但实际上只从fp指向文件中读入n-1个字符,然后在最后加一个’\0’字符。
(2)用fputs函数可以向指定的文件输出一个字符串。如:

fputs("China",fp);

字符串末尾的’\0’不输出。
(3)fgets函数,第一个字符f代表文件(file),中间的get是“取得”,最后的字母s代表字符串(string),含义是“从文件中取得字符串”。fgetc函数,最后一个字符是c(character),表示读写一个字符。
(4)gets函数和puts函数以终端为读写对象,fputs函数和fputs函数以指定的文件作为读写对象。

例题:
从键盘读入若干个字符串(fgets),对它们按字母大小顺序排序,然后把排好序的字符串送到磁盘文件中保存。
思路:
(1)从键盘读人n个字符串,存放在一个二维字符数组中、每一个一维数组存放一个字符串;(2)对字符数组中的n个字符串按字母顺序排序,排好序的字符串仍存放在字符数组中;
(3)将字符数组中的字符串顺序输出。
编写程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
	FILE *fp;//定义指向文件的指针变量fp
	char str[3][10],temp[10];//定义3行10列字符串二维数组str和临时的一维数组temp
	int i,j,k,n=3;
	printf("enter strings:\n");//提示输入字符串
	for(i=0;i<n;i++)  //将输入的字符串存放在字符数组中
		gets(str[i]);
	for(i=0;i<n-1;i++)//用选择法对字符串排序
		{k=i;
			for(j=i+1;j<n;j++)
				if(strcmp(str[k],str[j])>0) k=j;
			if(k!=i)
				{
					strcpy(temp,str[i]);
					strcpy(str[i],str[k]);
					strcpy(str[k],temp);
	}
}
	if ((fp=fopen("D:\\string.dat","w"))==NULL)//打开磁盘
		{
			printf("can not open file!\n");
			exit(0);
}
	printf("\nthe new squence:\n");
	for(i=0;i<n;i++)
		{
			fputs(str[i],fp);//向磁盘文件写数据
			fputs("\n",fp);
			printf("%s\n",str[i]);//在屏幕上显示
}
	return 0;
}

运行结果:
在这里插入图片描述
在这里插入图片描述
分析:
(1) 在打开文件时, 指定工文件路径。在D盘的下建立一个名为str.bat用来存放已排好序的字符串。本来应该写成"D:\str.dat",但由于在C语言中把" \ "作为转义宇符的标志,因此在字符串或字符中要表示\时,应当在之前再加一个\,即

"D:\\str.dat"

注意:只在双撤号或单撇号 中的 " \ " 才需要写成" \ \ ",其他情况下则不必。
(2)在向磁盘文件写数据时,只输出的字符串中的有效字符,并不包括字符串结束标志’\0’,这样前后两次输出的字符串之间无分隔,连成一片。当以后从磁盘文件读回数据时就无法区分各个字符串了。为了避免出现此情况,在输出一个字符串后,人为地输出一个"\n", 作为字符串之间的分隔, 见程序中的fputs("\n", fp) 。
(3)为运行简单,本例只输人3个字符串,如果有10个字符串,只需把n=3改为n=10即可。

3.3 文件的格式化读写

用fprintf函数和fscanf函数对文件进行格式化输入输出。用fprintf函数和fscanf函数的读写对象不是终端而是外部文件,一般调用方式为:

fprintf(文件指针,格式字符串,输出表列);
fscanf(文件指针,格式字符串,输出表列);

例如:

fprintf(fp,"%d %5.2f",i,f);

它的作用是将整型变量i和实型变量f的值按%d和%6.2f的格式输出到fp指向文件中。如果i=1,f=5.5,则输出到磁盘文件上的是字符:

1,5.5

和输出到屏幕的情况相似的,只是它没有输出到屏幕二是输出到文件。
同样,用以下fscanf函数可以从磁盘文件上读入ASCII字符:

fscanf(fp,"%d %f",&i,&f);

如果磁盘文件上有字符:

1,5.5

则从磁盘文佳中读取数据1送给变量i,5.5送给变量f。

3.4 用二进制方式读写文件

在程序中常常需要一次输入输出一组数据(如数组或结构体变量的值),C语言允许用fread函数从文件读一个数据块,用fwrite函数向文件写一个数据块。
调用形式为:

fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);

其中:
buffer; 是一个地址。对fread来说, 它是读人数据的存放地址。对fw re来说, 是要输出数据的地址(以上指的是起始地址)。
size:要读写的字节数。
count:要进行读写多少个size字节的数据项。
fp:文件型指针。文件以二进制形式打开。用fread和fwrite函数就可以读写任何类型的信息, 例如:

fread(f,4,10,fp);

其中f是一个实型数组名。一个实型变量占4字节,这个函数从fp所指向的文件读人10个4字节的数据,存储到数组f中。
例题:
在终端输入3个学生的有关数据,然后把它们转存到磁盘中。
编写程序:

#include <stdio.h>
#define SIZE 3
struct student_tpye//定义结构体类型student_tpye,成员有name,num,age,addr
{
	char name[10];//定义字符数组name
	int num;//定义整型num
	int age;//定义整型age
	char addr[15];//定义字符数组addr
}stud[SIZE];//定义结构体变量

void save()
{
	FILE *fp;//定义指向文件的指针变量
	if ((fp=fopen("D:\\stu_dat","wb"))==NULL)//新建文件,放在d盘
			{printf("can not open file\n");//若新建不成功,报错
			return;
	}
	for(int i=0;i<SIZE;i++)
		if(fwrite(&stud[i],sizeof(struct student_tpye),1,fp)!=1)//用fwrite函数向文件写一个数据块(一个学生的name,num,age,addr)
			printf("file write error\n");
		fclose(fp);//关闭文件
}
int main(){
	printf("enter data of student:");
	for(int i=0;i<SIZE;i++)//逐个3个学生的数据,存放在数组stud中
		scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);
	save();//调用save函数
	return 0;
}

运行结果:
在这里插入图片描述

分析:
(1) 在main函数中, 从终端键盘输人3个学生的数据, 然后调用save函数, 将这些数据输出到以“stu_dat"命名的磁盘文件中。fwrite函数的作用是将一个长度为33字节的数据块送到stu_dat文件中(一个struct student_type类型结构体变量的长度为它的成员长度之和, 即10+4+4+15=33.假设int型数据占4字节) 。
(2) 在fopen函数中指定读写方式为“wb”, 即二进制只写方式。在向磁盘文件stu_dat写的时候,将内存中存放stud数组元素stud[i] 的内存单元中的内容原样复制到磁盘文件
(3)程序运行时,屏幕上并无输出任何信息,只是将从键盘输入的数据送到磁盘文件上。为了验证在磁盘文件“stu_dat”中是否已存在此数据, 可以用以下程序从“stu_dat”文件中读人数据,然后在屏幕上输出
编写读取stu_dat文件的程序:

#include <stdio.h>
#define SIZE 3
struct student_tpye//定义结构体类型student_tpye,成员有name,num,age,addr
{
	char name[10];//定义字符数组name
	int num;//定义整型num
	int age;//定义整型age
	char addr[15];//定义字符数组addr
}stud[SIZE];//定义结构体变量

int main(){
	FILE *fp;//定义指向文件的指针变量
	if ((fp=fopen("D:\\stu_dat","rb"))==NULL)//读取文件
		{
		printf("can not open file\n");//若读取不成功,报错
			return 0;
	}
	for(int i=0;i<SIZE;i++)
		{(fread(&stud[i],sizeof(struct student_tpye),1,fp));//用fread函数向文件读一个数据块(一个学生的name,num,age,addr)
			printf("%-10s %4d %4d %-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);//在屏幕上输出这组数据
			}
	fclose(fp);//关闭文件
	return 0;
}

运行结果:(在屏幕显示出以下信息):
在这里插入图片描述

4 文件的随机读写

随机访问时可以对任何位置上的数据进行访问。

4.1 文件位置标记及其定位

系统为每一个文件设置一个文件读写标记(简称文件位置标记和文件标记),用来指示当前的读写位置。
随机读写可以根据读写需要,人为地移动文件位置标记的位置。
(1)用rewind函数使用文件位置标记指向文件头。
rewind函数的作用是使文件位置标记重新返回文件的开头,此函数没有返回值。

(2)用fseek函数移动文件位置标记。
用fseek函数可以改变文件位置标记的位置。
fseek函数的调用形式为

fseek(文件类型指针,位移量,起始点);

使用时,“起始点”用0、1或2代替,0代表“文件的开始”,1为“当前位置”,2为“文件末尾”。
位移量指以“起始点”为基点,向前移动的字节数。C语言要求位移量是long型数据(在数字的末尾加一个字符母L,就表示long型)。
fseek函数一般用于二进制文件。
例子:

fseek(fp,100L,0);//将文件位置标记移到离文件头100字节处
fseek(fp,50L,1);//将文件位置标记移到离当前位置后面50字节处
fseek(fp,-10L,2);//将文件位置标记从文件末尾处向后退10字节

(3)用ftell函数测定文件位置标记的当前位置。
如果ftell函数返回值为-1L,表示出错。

4.2 随机读写文件

例题:
在磁盘文件stu_dat上已存有3个学生的的数据。现要求将该文件中的第1、3个学生数据输入计算机,并在屏幕上显示出来。
解题思路:
(1)按“二进制只读”的方式打开指定的磁盘文件,准备从磁盘文件中读取学生数据(2)将文件位置标记指向文件的开头,然后从磁盘文件读人一个学生的信息,并把它显示在屏幕上。
(3)再将文件位置标记指向文件中第3个学生的数据区的开头,从磁盘文件读人相应学生的信息,并把它显示在屏幕上。
(4)关闭文件。
编写程序:

#include <stdio.h>
#include <stdlib.h>
struct student_type//定义结构体类型student_tpye,成员有name,num,age,addr
{
	char name[10];//定义字符数组name
	int num;//定义整型num
	int age;//定义整型age
	char addr[15];//定义字符数组addr
}stud[3];//定义结构体变量

int main()
{
	FILE *fp;//定义指向文件的指针变量
	if ((fp=fopen("D:\\stu_dat","rb"))==NULL)//读取文件
		{
		printf("can not open file\n");//若读取不成功,报错
		exit(0);
	}
	for(int i=0;i<3;i+=2)//i+=2等价于i=i+2
		{
		fseek(fp,i*sizeof(struct student_type),0); //移动文件位置标记
		fread(&stud[i],sizeof(struct student_type),1,fp); //用fread函数向文件读一个数据块(一个学生的name,num,age,addr)
		printf("%-10s %4d %4d %-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr); //在屏幕上输出这组数据
			}
	fclose(fp);//关闭文件
	return 0;
}

运行结果:
在这里插入图片描述
分析:

函数中, 指定“起始点”为0, 即以文件开头为参照点。位移量为i*sizeof(struct student_type) ,sizeof(struct student_type) 是struct student_type类型变量的长度(字节数) , i初值为0。
第1次执行fread函数时, 读人长度为sizeof(struct student_type) 的数据,即第1个学生的信息,把它存放在结构体数组的元素stud[0] 中, 然后在屏幕上输出该学生的信息。在第2次循环时, i增值为2,文件位置标记的移动量是struct student_type类型变量的长度的两倍, 即跳过一个结构体变量,移到第3个学生的数据区的开头,然后用fread函数读人一个结构体变量, 即第3个学生的信息, 存放在结构体数组的元素stud[2] 中, 并输出到屏幕。

每次文件位置标记的移动量是结构体变长度的两倍,这样就读取了第1,3学生的信息。

需要注意的是应当在磁盘中已经有所指定的文件“stu_dat”, 并且在该文件中存在这些学生的信息,否则会出错。

5 提高部分

5.1 系统定义的文件类型指针

为了方便用户,系统在程C标准序开始运行时,自动打开3个标准文件, 标准输人stdin、标准输出stdout和标准出错输出1.Terr ostderr。因此用户就不需要自己打开终端文件了在调用。

5.2 回车换行符的转换

回车和换行符转换为一个换行符,在输出时把换行符转换成为回车和换行两个字符。在用二进制文件时,不进行这种转换,在内存中的数据形式与输出到外部文件中的数据形式完全一致,一一对应。

5.3 fread和fwrite函数用于二进制文件的输入输出

fread和fwrite函数只能用于二进制文件的输入输出。

5.4 文件读写的出错检测

5.4.1 ferror函数
在调用各种输人输出函数(如putc、getc, fread、fwrite等) 时, 如果出现错误, 可以用ferror函数检查。它的一般调用形式为:
ferror(fp)
如果ferror返回值为0(假) ,表示未出错;如果返回一个非零值, 表未出错。
应该注意, 对同一个文件每一次调用输入输出函数, 都会产生一个新的ferror函数值, 因此, 应当在调用一个输人输出函数后立即检查ferror函数的值, 否则信息会丢失。
在执行fopen函数时, ferror函数的初始值自动置为0。

5.4.2 clearerr函数
clearerr的作用是使文件唔错标志和文件结束标志为0。

6 小结

(1)文件是在外部介质上数据的集合,操作系统把所有输入输出设备都作为文件来管理,一个文件需要有一个文件标识,包括文件路径、文件主干名和文件后缀。
(2) 数据文件有两类:ASCII文件和二进制文件。
(3)C语言采用缓冲文件系统,为每一个使用的文件在内存开辟一个文件缓冲区,在计算机输人时,先从文件把数据读到文件缓冲区,然后从缓冲区分别送到各变量的存储单元。在输出时,先从内存数据区将数据送到文件缓冲区,待放满缓冲区后一次输出。
(4)文件指针是缓冲文件系统中的一个重要的概念。在文件打开时,在内存建立一个文件信息区,存放文件的有关特征和当前状态。 具体来说就是指向某一文件信息区的开头。通过这个指针可以得到文件的有关信息,从而对文件进行操作。这就是指针指向文件的含义。
(5)文件使用前必须“打开”,用完后应当“关闭”。
(6)有两种对文件的读写方式、顺序读写和随机读写。
(7)对文件的操作,要通过文件操作函数实现。
在这里插入图片描述

  • 70
    点赞
  • 326
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个例子,如下所示: 假设我们要设计一个学生管理系统,需要实现以下功能: 1. 添加学生信息 2. 修改学生信息 3. 删除学生信息 4. 查询学生信息 5. 显示所有学生信息 我们可以利用结构体数组来存储学生信息,利用文件来实现数据的永久性存储。 首先,我们定义一个学生结构体,包含学生的姓名、学号、年龄等信息: ```c struct Student { char name[20]; int id; int age; // 其他信息 }; ``` 接着,我们定义一个结构体数组来存储学生信息: ```c struct Student students[100]; int count = 0; // 学生数量 ``` 然后,我们可以编写一个菜单程序,让用户选择需要执行的操作: ```c void menu() { printf("1. 添加学生信息\n"); printf("2. 修改学生信息\n"); printf("3. 删除学生信息\n"); printf("4. 查询学生信息\n"); printf("5. 显示所有学生信息\n"); printf("6. 退出程序\n"); } ``` 接着,我们可以根据用户的选择来执行不同的操作。下面是每个操作的代码: 1. 添加学生信息 ```c void addStudent() { struct Student student; printf("请输入学生姓名:"); scanf("%s", student.name); printf("请输入学生学号:"); scanf("%d", &student.id); printf("请输入学生年龄:"); scanf("%d", &student.age); // 其他信息 students[count++] = student; // 将学生信息添加到结构体数组 printf("添加成功!\n"); } ``` 2. 修改学生信息 ```c void modifyStudent() { int id; printf("请输入要修改的学生学号:"); scanf("%d", &id); for (int i = 0; i < count; i++) { if (students[i].id == id) { printf("请输入学生姓名:"); scanf("%s", students[i].name); printf("请输入学生年龄:"); scanf("%d", &students[i].age); // 其他信息 printf("修改成功!\n"); return; } } printf("未找到该学生!\n"); } ``` 3. 删除学生信息 ```c void deleteStudent() { int id; printf("请输入要删除的学生学号:"); scanf("%d", &id); for (int i = 0; i < count; i++) { if (students[i].id == id) { for (int j = i; j < count - 1; j++) { students[j] = students[j + 1]; // 将后面的学生信息向前移动 } count--; // 学生数量减1 printf("删除成功!\n"); return; } } printf("未找到该学生!\n"); } ``` 4. 查询学生信息 ```c void queryStudent() { int id; printf("请输入要查询的学生学号:"); scanf("%d", &id); for (int i = 0; i < count; i++) { if (students[i].id == id) { printf("学生姓名:%s\n", students[i].name); printf("学生年龄:%d\n", students[i].age); // 其他信息 return; } } printf("未找到该学生!\n"); } ``` 5. 显示所有学生信息 ```c void showAllStudents() { if (count == 0) { printf("无学生信息!\n"); return; } printf("学生信息如下:\n"); for (int i = 0; i < count; i++) { printf("学生姓名:%s\n", students[i].name); printf("学生学号:%d\n", students[i].id); printf("学生年龄:%d\n", students[i].age); // 其他信息 } } ``` 最后,我们可以将学生信息保存文件,以便下次打开程序时可以读取到之前保存的信息: ```c void saveToFile() { FILE *fp; fp = fopen("students.txt", "w"); for (int i = 0; i < count; i++) { fprintf(fp, "%s %d %d\n", students[i].name, students[i].id, students[i].age); // 其他信息 } fclose(fp); printf("保存成功!\n"); } void loadFromFile() { FILE *fp; fp = fopen("students.txt", "r"); if (fp == NULL) { printf("未找到数据文件!\n"); return; } while (!feof(fp) && count < 100) { struct Student student; fscanf(fp, "%s %d %d\n", student.name, &student.id, &student.age); // 其他信息 students[count++] = student; } fclose(fp); printf("加载成功!\n"); } ``` 完整代码如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值