C语言文件操作函数详解:从基础到实战
C语言文件操作函数详解:从基础到实战
一、引言
在C语言编程中,文件操作是必不可少的重要技能。无论是数据持久化、日志记录还是配置文件读取,都需要用到文件操作函数。本文将全面讲解C语言中文件操作的各种函数,帮助大家掌握文件操作的核心技能。
二、文件操作基础
1. 文件指针
在C语言中,我们使用FILE结构体指针来操作文件:
FILE *file_pointer;
2. 文件打开模式
| 模式 | 描述 |
|---|---|
| "r" | 只读方式打开文本文件 |
| "w" | 只写方式创建/清空文本文件 |
| "a" | 追加方式打开文本文件 |
| "r+" | 读写方式打开文本文件 |
| "w+" | 读写方式创建/清空文本文件 |
| "a+" | 读写方式追加打开文本文件 |
| "rb" | 只读方式打开二进制文件 |
| "wb" | 只写方式创建/清空二进制文件 |
三、文件操作函数详解
1. 文件打开与关闭
1.1 fopen()
FILE *fopen(const char *filename, const char *mode);
- 功能:打开文件
- 参数:文件名、打开模式
- 返回值:成功返回文件指针,失败返回NULL
1.2 fclose()
int fclose(FILE *stream);
- 功能:关闭文件
- 返回值:成功返回0,失败返回EOF
2. 字符读写函数
2.1 fgetc()
int fgetc(FILE *stream);
- 功能:从文件中读取一个字符
- 返回值:成功返回读取的字符,失败或文件结尾返回EOF
2.2 fputc()
int fputc(int char, FILE *stream);
- 功能:向文件写入一个字符
- 返回值:成功返回写入的字符,失败返回EOF
3. 字符串读写函数
3.1 fgets()
char *fgets(char *str, int n, FILE *stream);
- 功能:从文件中读取字符串
- 参数:存储缓冲区、最大读取长度、文件指针
- 返回值:成功返回str指针,失败返回NULL
3.2 fputs()
int fputs(const char *str, FILE *stream);
- 功能:向文件写入字符串
- 返回值:成功返回非负整数,失败返回EOF
4. 格式化读写函数
4.1 fprintf()
int fprintf(FILE *stream, const char *format, ...);
- 功能:格式化输出到文件
- 示例:
fprintf(file, "Name: %s, Age: %d\n", name, age);
4.2 fscanf()
int fscanf(FILE *stream, const char *format, ...);
- 功能:从文件格式化输入
- 示例:
fscanf(file, "Name: %s, Age: %d", name, &age);
5. 二进制文件操作
5.1 fread()
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
- 功能:从文件读取二进制数据
- 参数:数据缓冲区、单个元素大小、元素个数、文件指针
- 返回值:成功读取的元素个数
5.2 fwrite()
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
- 功能:向文件写入二进制数据
- 返回值:成功写入的元素个数
6. 文件定位函数
6.1 fseek()
int fseek(FILE *stream, long offset, int whence);
- 功能:设置文件位置指针
- 参数:偏移量、起始位置(SEEK_SET/SEEK_CUR/SEEK_END)
6.2 ftell()
long ftell(FILE *stream);
- 功能:获取当前文件位置
- 返回值:当前位置偏移量
6.3 rewind()
void rewind(FILE *stream);
- 功能:重置文件位置到开头
7. 文件状态检测
7.1 feof()
int feof(FILE *stream);
- 功能:检测文件结束标志
- 返回值:非0表示到达文件结尾
7.2 ferror()
int ferror(FILE *stream);
- 功能:检测文件错误
- 返回值:非0表示发生错误
四、实战应用示例
1. 文件复制程序
#include <stdio.h>
int main() {
FILE *src, *dest;
char buffer[1024];
size_t bytes;
src = fopen("source.txt", "rb");
if (!src) {
perror("Source file error");
return 1;
}
dest = fopen("destination.txt", "wb");
if (!dest) {
perror("Destination file error");
fclose(src);
return 1;
}
while ((bytes = fread(buffer, 1, sizeof(buffer), src)) {
fwrite(buffer, 1, bytes, dest);
}
fclose(src);
fclose(dest);
printf("File copied successfully!\n");
return 0;
}
2. 学生信息管理系统
#include <stdio.h>
typedef struct {
int id;
char name[50];
float score;
} Student;
void save_student(Student *s) {
FILE *file = fopen("students.dat", "ab");
if (!file) {
perror("File open error");
return;
}
fwrite(s, sizeof(Student), 1, file);
fclose(file);
}
void list_students() {
FILE *file = fopen("students.dat", "rb");
if (!file) {
perror("File open error");
return;
}
Student s;
printf("\nStudent List:\n");
printf("ID\tName\tScore\n");
while (fread(&s, sizeof(Student), 1, file)) {
printf("%d\t%s\t%.2f\n", s.id, s.name, s.score);
}
fclose(file);
}
int main() {
// 添加学生示例
Student s1 = {1, "Alice", 95.5};
Student s2 = {2, "Bob", 88.0};
save_student(&s1);
save_student(&s2);
// 列出学生
list_students();
return 0;
}
五、最佳实践与注意事项
-
文件打开检查:每次打开文件后都要检查是否成功
if (file == NULL) { perror("File opening failed"); return EXIT_FAILURE; } -
文件关闭:操作完成后务必关闭文件
fclose(file); -
错误处理:使用ferror()检查文件操作错误
if (ferror(file)) { printf("Error reading file\n"); } -
二进制与文本模式:在Windows系统中注意换行符差异
-
缓冲区刷新:及时使用fflush()确保数据写入
fflush(file); -
文件定位:使用fseek()和ftell()获取文件大小
fseek(file, 0, SEEK_END); long size = ftell(file); rewind(file);
六、总结
C语言提供了丰富的文件操作函数,从基础的字符读写到高级的二进制数据处理,可以满足各种文件操作需求。掌握这些函数的使用方法和注意事项,能够帮助我们开发出更健壮、高效的应用程序。
本文详细讲解了C语言文件操作的各类函数及其使用方法,并提供了实用的代码示例。希望本文能帮助你在C语言文件操作方面有所提高!

浙公网安备 33010602011771号