文章目录
- 一、简单的文件操作流程
- 二、文件打开模式
- 三、读写文件的方法和技巧
- 四、实现一个简单的学生信息管理系统
-
- 1.学生信息管理系统-交互界面设计
- 2.实现相关功能
-
- 2.1实现打印学生信息
- 2.2添加学生信息
- 2.3实现修改学生信息功能
- 2.4实现删除学生信息功能
- 3.学生信息管理系统总结
- 优化1:实现单条数据的修改
-
- 通过fseek和ftell进行对学生管理系统的优化
- 优化2:实现数据的二进制存储
- 五、文章说明
一、简单的文件操作流程
现在假如有一个文件data.txt和一个可执行程序
在文件中如何存储文件类型:FILE*,FILE指针类型,然后我们可以通过定义一个FILE指针类型定义一个指针变量进行指向我们需要进行操作的文件。
现在fp是没有指向data.txt文件的,现在需要借用一个函数才能进行指向data.txt
这个函数是fopen
现在指向data.txt的文件指针了,如果需要对data.txt文件中输入内容,需要使用函数fprintf
程序测试
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp = fopen("./data.txt", "w");
//当没有成功打开文件时,打印提示信息,并结束程序
if (fp == NULL) {
printf("failed to open file\n");
exit(1);
}
//向文件中打印内容
fprintf(fp, "hello world\n");
int a = 123, b = 456;
fprintf(fp, "a = %d, b = %d\n", a, b);
fclose(fp);
return 0;
}
执行结果
打开data.txt文件查看
二、文件打开模式
二进制模式(在任何模式后加上"b",“r"模式就是"rb”,r+“模式就是"rb+”,以此类推)
- 以二进制模式打开文件,用于处理二进制文件。例如,“rb” 表示以只读模式打开二进制文件。
对于r和r+,w和w+的代码演示
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
void r_access() {
//以只读方式打开data.txt
FILE *fp = fopen("./data.txt", "r");
if (fp == NULL) {
printf("r : failed to open file\n");
exit(1);
}
char s[100];
//读取文件中的内容
fscanf(fp, "%[^\n]", s);
printf("r : s = %s\n", s);
fclose(fp);
fp = fopen("temp.txt", "r");
//如果以r模式打开不存在的文件,那么会打开失败返回NULL空地址
if (fp == NULL) {
printf("r : open erroe\n");
}
//使用过后记得关闭
return ;
}
void rand_file_name(char *file_name, int n) {
for (int i = 0; i < n; i++) {
file_name[i] = rand() % 26 + 'a';
}
file_name[n] = 0;
//在文件名末尾加上.txt
//strcat作用将第一个参数的后面加上第二个参数的字符串
strcat(file_name, ".txt");
return ;
}
void w_access() {
//测试存在的文件
FILE *fp = fopen("data.txt", "w");
if (fp == NULL) {
printf("w : failed to open file\n");
exit(1);
}
//向文件中输入内容,并且在输入前会清空文件中的内容
fprintf(fp, "w :hahahahah, world\n");
fprintf(fp, "hello nihao\n");
fclose(fp);
char file_name[100] = {
0};
rand_file_name(file_name, 10);
//当用w打开不存在的文件时,会创建新的文件,并且文件名就是fopen的第一个参数
printf("w : open new name : %s\n", file_name);
fp = fopen(file_name, "w");
fclose(fp);
return ;
}
void r_plus_access() {
//现在打开data.txt可以对文件进行读取和写入内容
FILE *fp = fopen("data.txt", "r+");
if (fp == NULL) {
printf("r+ : failed to open file\n");
exit(1);
}
char s[100];
fscanf(fp, "%s", s);
printf("r+ : s = %s\n", s);
//在r+模式下写入内容,默认会在文件末尾进行写入
fprintf(fp, "000000");
fclose(fp);
//打开不存在的文件
fp = fopen("data2.txt", "r+");
if (fp == NULL) {
printf("r+ : open error\n");
}
return ;
}
void w_plus_access() {
//测试存在的文件
FILE *fp = fopen("data.txt", "w+");
if (fp == NULL) {
printf("w : failed to open file\n");
exit(1);
}
//向文件中输入内容,并且在输入前会清空文件中的内容
fprintf(fp, "w+ :hahahahah, world\n");
char s[100] = {
0};
fscanf(fp, "%s", s);
//对于这里为什么读取的内容为空,在后续代码会进行解释
printf("w+ : %s\n", s);
fclose(fp);
char file_name[100] = {
0};
rand_file_name(file_name, 10);
//当用w+打开不存在的文件时,会创建新的文件,并且文件名就是fopen的第一个参数
printf("w+ : open new name : %s\n", file_name);
fp = fopen(file_name, "w+");
fclose(fp);
return ;
}
int main() {
srand(time(0));
r_access();
w_access();
r_plus_access();
w_plus_access();
return 0;
}
对于这部分代码,从调用的函数顺序一个一个实现和测试,而不是把全部代码写上去在测试,并且最开始当前目录下是有一个data.txt文件的。我的data.txt文件最初内容是hello world
全部代码执行结果
这分别是我用w和w+模式生成的新文件
三、读写文件的方法和技巧
这里直接用代码演示:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//定义一个文件名
const char *file_name = "data3.txt";
//定义一个整形数组,用来写入文件的数据
#define MAX_N 10000
int arr[MAX_N + 5], n = 0;//n代表存储了多少个数据
void output_arr(int *arr, int n) {
for (int i = 0; i < n; i++) {
//如果不理解这句代码可以看看之前逻辑关系的知识点
//和 if (i) printf(" ");的功能一样
i && printf(" ");
printf("%d", arr[i]);
}
putchar(10);
return ;
}
//1.写入文件
void output_to_file(int *arr, int n) {
//需要在文件中追加写入内容,所以打开模式用 a
FILE *fp = fopen(file_name, "a");
for (int i = 0; i < n; i++) {
fprintf(fp, "%d ", arr[i]);
}
//打开文件,一定要记得关闭
fclose(fp);
return ;
}
//返回值代表读入了多少个整形
//2.从文件中读取数据
int read_from_file(int *arr) {
int i = 0;
//由于要向文件中读取数据,所以打开模式用r
FILE *fp = fopen(file_name, "r");
//如果文件打开失败,说明读取0个数据返回0
if (fp == NULL