一、文件操作的基本概念
C语言通过标准库提供了丰富的文件操作函数。这些函数大部分定义在头文件<stdio.h> 中。我们可以通过这些函数来实现:
- 创建文件
- 打开文件
- 读取文件内容
- 写入文件内容
- 关闭文件
C语言将文件操作看作是“流”的处理,即将数据从程序流向文件或从文件流向程序。
文件指针 (FILE *
)
文件操作通过 FILE *
文件指针进行。FILE
是一个结构体类型,包含与文件相关的信息。我们使用 fopen()
打开文件时会返回一个指向 FILE
类型的指针,之后通过这个指针对文件进行操作。
二、文件的打开与关闭
文件打开:fopen()
fopen()
是打开文件的主要函数。语法如下:
FILE *fopen(const char *filename, const char *mode);
参数:
- filename:文件路径(可以是相对路径或绝对路径)。
- mode:文件的打开模式。
打开模式列表:
模式 | 描述 |
"r" | 以只读模式打开文件,文件必须存在。 |
"w" | 以写模式打开文件,文件不存在则创建,存在则清空内容。 |
"a" | 以追加模式打开文件,文件不存在则创建,写入附加到末尾。 |
"r+" | 以读写模式打开文件,文件必须存在。 |
"w+" | 以读写模式打开文件,文件不存在则创建,存在则清空内容。 |
"a+" | 以读写模式打开文件,写入附加到末尾。文件不存在则创建。 |
例如
#include <stdio.h> int main() { FILE *file = fopen("example.txt", "w"); // 以写入模式打开文件 if (file == NULL) { // 检查文件是否打开成功 printf("文件打开失败!\n"); return -1; } printf("文件打开成功!\n"); fclose(file); // 关闭文件 return 0; }
文件关闭:fclose()
使用完文件后,必须关闭文件以释放资源。语法如下:
int fclose(FILE *stream);
返回值为
0
表示关闭成功,EOF
表示关闭失败。
三、文件的顺序读写
文件的顺序读写是最常见的操作模式。文件中的数据从头到尾按顺序读写。
文件写入
常用写入函数:
fprintf(FILE *stream, const char *format, ...)
:格式化写入。fputs(const char *str, FILE *stream)
:写入字符串。fwrite(const void *ptr, size_t size, size_t count, FILE *stream)
:写入二进制数据。
示例代码:
#include <stdio.h> int main() { // 打开文件 example.txt,以写模式打开 FILE* file = fopen("example.txt", "w"); if (file == NULL) { printf("无法打开文件!\n"); return -1; } // 使用 fprintf 写入数据 fprintf(file, "年龄: %d, 名字 : % s, 体重: % .2fkg\n", 17, "矛取矛求",75.60 ); // 使用 fputs 写入字符串 fputs("这是一个 完美的男人。\n", file); fclose(file); // 关闭文件 printf("文件写入完成!\n"); return 0; }
运行结果
执行程序后,文件 example.txt
的内容如下:
😁
文件读取
逐字符读取文件
使用 fgetc()
从文件中逐个字符读取。
#include <stdio.h> int main() { // 打开文件 example.txt,以只读模式打开 FILE *file = fopen("example.txt", "r"); if (file == NULL) { printf("无法打开文件!\n"); return -1; } char ch; printf("逐字符读取文件内容:\n"); // 使用 fgetc 按字符读取文件 while ((ch = fgetc(file)) != EOF) { putchar(ch); // 输出读取的字符 } fclose(file); // 关闭文件 return 0; }
四、文件的随机读写
以下是操控文件指针的几个重要函数:
-
-
功能:将文件指针移动到指定位置。 - 参数:
stream
:文件指针。offset
:相对于origin
的偏移量。origin
:参考位置:SEEK_SET
:文件开头。SEEK_CUR
:文件当前位置。SEEK_END
:文件末尾。
-
-
ftell(FILE *stream)
- 功能:获取当前文件指针的位置。
-
rewind(FILE *stream)
- 功能:将文件指针移动到文件开头(等同于
fseek(stream, 0, SEEK_SET)
)
- 功能:将文件指针移动到文件开头(等同于
4.1随机写入数据
展示如何使用
fseek
定位文件中的位置,然后写入数据。#include <stdio.h> int main() { FILE *file = fopen("example.txt", "w+"); // 打开文件(读写模式) if (file == NULL) { printf("文件打开失败!\n"); return -1; } // 写入初始数据 fprintf(file, "Hello, World!\n"); // 将文件指针移动到第7个字符位置(从0开始计数) fseek(file, 7, SEEK_SET); fprintf(file, "C Language"); fclose(file); // 关闭文件 printf("随机写入完成!\n"); return 0; }
执行程序后,
example.txt
的内容如下:
4.2 随机读取数据
展示如何从文件中读取指定位置的数据。
#include <stdio.h> int main() { FILE *file = fopen("example.txt", "r"); // 以只读模式打开文件 if (file == NULL) { printf("文件打开失败!\n"); return -1; } // 将文件指针移动到第7个字符位置 fseek(file, 7, SEEK_SET); // 读取从第7个字符开始的5个字符 char buffer[6]; // 注意:多分配一个字符用于存储 '\0' fread(buffer, sizeof(char), 5, file); buffer[5] = '\0'; // 手动添加字符串结束符 printf("从文件中读取的数据:%s\n", buffer); fclose(file); return 0; }
4.3随机读写结构化数据(重要)
处理结构化数据(如结构体)时,随机读写特别有用。以下示例展示如何读写文件中的特定记录。
#include <stdio.h> #include <string.h> // 定义一个结构体 typedef struct { int id; char name[20]; float score; } Student; int main() { FILE *file = fopen("students.dat", "wb+"); // 打开二进制文件(读写模式) if (file == NULL) { printf("文件打开失败!\n"); return -1; } // 写入3条学生记录 Student students[3] = { {1, "Alice", 88.5}, {2, "Bob", 75.0}, {3, "Charlie", 92.0} }; fwrite(students, sizeof(Student), 3, file); // 随机修改第2条记录 Student newStudent = {2, "Bob", 95.0}; fseek(file, sizeof(Student) * 1, SEEK_SET); // 定位到第2条记录(从0开始计数) fwrite(&newStudent, sizeof(Student), 1, file); // 读取第2条记录,验证修改是否成功 Student readStudent; fseek(file, sizeof(Student) * 1, SEEK_SET); // 定位到第2条记录 fread(&readStudent, sizeof(Student), 1, file); printf("第2条记录修改后:ID=%d, Name=%s, Score=%.1f\n", readStudent.id, readStudent.name, readStudent.score); fclose(file); // 关闭文件 return 0; }
五、完整代码示例
综合示例(如何实现文件的打开、顺序写入、顺序读取、随机写入和随机读取。)
#include <stdio.h> int main() { FILE *file; // 打开文件并写入数据 file = fopen("example.txt", "w+"); if (file == NULL) { printf("文件打开失败!\n"); return -1; } fprintf(file, "这是一个文件操作的示例。\n"); fprintf(file, "学习C语言文件操作很重要。\n"); // 随机写入数据 fseek(file, 5, SEEK_SET); fprintf(file, "[插入内容]"); // 读取文件内容 rewind(file); // 回到文件开头 char buffer[100]; printf("文件内容如下:\n"); while (fgets(buffer, sizeof(buffer), file) != NULL) { printf("%s", buffer); } fclose(file); // 关闭文件 return 0; }