将学生信息(姓名、年龄、学号和平均分)写入文件,然后读取显示出来。
要求:
代码实现:
运行结果:
用记事本打开 D:/demo.txt,可以看到刚才输入的内容。
程序主要分为三个步骤。
perror() 函数在程序退出前,输出具体的错误信息。
注意:fprintf() 函数并不在结尾自动添加换行符(\n),显示增加换行符的目的是:
两点说明:
要求:
- 从控制台输入学生信息;
- 可以输入任意数目的学生信息;
- 文件每行存储一条学生信息,姓名、年龄、学号、平均分以tab(\t)为分隔。
代码实现:
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #define FILE_PATH "D:/demo.txt" // 文件路径
- int main(){
- char name[20]; // 姓名
- int age; // 年龄
- int studNo; // 学号
- float score; // 平均分
- FILE *fp; // 文件指针
- // 判断文件是否能够正确创建/打开
- if( (fp=fopen(FILE_PATH,"wt+")) == NULL ){
- perror(FILE_PATH);
- exit(1);
- }
- // 从控制台输入学生信息并写入文件
- printf("请输入姓名、年龄、学号和平均分(以空格分隔):\n");
- while(scanf("%s %d %d %f", name, &age, &studNo, &score)!= EOF){
- fprintf(fp,"%s\t%d\t%d\t%f\n", name, age, studNo, score);
- }
- // 刷新缓冲区,将缓冲区的内容写入文件
- fflush(fp);
- // 重置文件内部位置指针,让位置指针指向文件开头
- rewind(fp);
- // 从文件中读取学生信息
- printf("\n读取文件内容:\n");
- while(fscanf(fp, "%s\t%d\t%d\t%f", name, &age, &studNo, &score) != EOF){
- printf("%s %d %d %f\n", name, age, studNo, score);
- }
- fclose(fp);
- return EXIT_SUCCESS;
- }
#include <stdio.h> #include <stdlib.h> #include <errno.h>#define FILE_PATH "D:/demo.txt" // 文件路径int main(){char name[20]; // 姓名 int age; // 年龄 int studNo; // 学号 float score; // 平均分 FILE *fp; // 文件指针 // 判断文件是否能够正确创建/打开 if( (fp=fopen(FILE_PATH,"wt+")) == NULL ){perror(FILE_PATH);exit(1);}// 从控制台输入学生信息并写入文件printf("请输入姓名、年龄、学号和平均分(以空格分隔):\n");while(scanf("%s %d %d %f", name, &age, &studNo, &score)!= EOF){fprintf(fp,"%s\t%d\t%d\t%f\n", name, age, studNo, score);}// 刷新缓冲区,将缓冲区的内容写入文件 fflush(fp);// 重置文件内部位置指针,让位置指针指向文件开头rewind(fp);// 从文件中读取学生信息printf("\n读取文件内容:\n");while(fscanf(fp, "%s\t%d\t%d\t%f", name, &age, &studNo, &score) != EOF){printf("%s %d %d %f\n", name, age, studNo, score);}fclose(fp);return EXIT_SUCCESS; }
请输入姓名、年龄、学号和平均分(以空格分隔): 棍哥 25 1 99.99 码农宿舍 2 3 89.9 www.coderbbs.com 3 2 100 ^Z // ^Z 为 Ctrl+Z 组合键,表示输入结束读取文件内容: 棍哥 25 1 99.989998 码农宿舍 2 3 89.900002 www.coderbbs.com 3 2 100.000000
用记事本打开 D:/demo.txt,可以看到刚才输入的内容。
程序主要分为三个步骤。
1) 以读写方式打开文件
wt+ 表示以读写方式打开文本文件,如果文件不存在,则创建,如果存在,清空内容。perror() 函数在程序退出前,输出具体的错误信息。
2) 从控制台获取学生信息,并写入文件
通过while循环不断读取学生信息,没有限制具体数目,按 Ctrl+Z 组合键结束输入。Ctrl+Z表示文件输入结束,即EOF。注意:fprintf() 函数并不在结尾自动添加换行符(\n),显示增加换行符的目的是:
- 用记事本打开文件后可以清晰的看到学生信息,一个学生占据一行;否则所有学生信息都在一行,阅读困难。
- 后续读取文件时,fscanf() 以换行符为读取结束标志,没有换行符将不能正确读取数据,这一点与 scanf() 类似。
两点说明:
- 输入结束时并没有将输入内容保存到文件,而是停留在缓冲区,导致后边读取文件时没有内容。所以必须通过 fflush() 函数刷新缓冲区,将缓冲区中的内容写入文件。
- 将缓冲区的内容写入文件后,文件内部位置指针实际指向了文件结尾,必须重置位置指针,否则后续读取会出错。rewind() 函数将位置指针重置到文件开头。