**一、文件操作基础**
在C语言中,文件操作通过标准库函数实现,需包含头文件 `<stdio.h>`。文件操作的核心是 **文件指针**(`FILE *`),用于标识文件流。
**二、文件操作步骤**
1. **打开文件**:`fopen()`
2. **读写文件**:`fprintf()`, `fscanf()`, `fgets()`, `fputs()`, `fread()`, `fwrite()`
3. **关闭文件**:`fclose()`
**三、常用函数详解**
1. **打开文件**:`fopen()`
FILE *fopen(const char *filename, const char *mode);
- **参数**:
- `filename`:文件名(含路径,如 `"data.txt"`)。
- `mode`:打开模式(见下表)。
- **返回值**:成功返回文件指针,失败返回 `NULL`。
| 模式 | 说明 |
|------|------|
| `"r"` | 只读(文件必须存在) |
| `"w"` | 写入(覆盖原有内容,文件不存在则创建) |
| `"a"` | 追加(在文件末尾写入,文件不存在则创建) |
| `"r+"` | 读写(文件必须存在) |
| `"w+"` | 读写(覆盖原有内容) |
| `"a+"` | 读写(追加模式) |
| `"b"` | 二进制模式(如 `"rb"`, `"wb"`) |
2. **关闭文件**:`fclose()`
int fclose(FILE *stream);
- **返回值**:成功返回 `0`,失败返回 `EOF`。
3. **文本文件读写**
- **写入文本文件**:`fprintf()`, `fputs()`
```
int fprintf(FILE *stream, const char *format, ...); // 格式化写入
int fputs(const char *str, FILE *stream); // 写入字符串
```
- **读取文本文件**:`fscanf()`, `fgets()`
```
int fscanf(FILE *stream, const char *format, ...); // 格式化读取
char *fgets(char *str, int n, FILE *stream); // 读取一行(最多n-1个字符)
```
4. **二进制文件读写**
- **写入二进制文件**:`fwrite()`
```
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
```
- `ptr`:数据指针(如数组首地址)
- `size`:每个数据块的大小(如 `sizeof(int)`)
- `count`:写入的数据块数量
- **读取二进制文件**:`fread()`
```
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
```
**四、完整示例**
示例1:写入和读取文本文件
#include <stdio.h>
int main() {
FILE *fp;
char text[] = "Hello, C File Operations!";
// 写入文件
fp = fopen("test.txt", "w");
if (fp == NULL) {
printf("Failed to open file!\n");
return 1;
}
fprintf(fp, "%s\n", text); // 或 fputs(text, fp);
fclose(fp);
// 读取文件
fp = fopen("test.txt", "r");
char buffer[100];
fgets(buffer, sizeof(buffer), fp);
printf("Read from file: %s", buffer);
fclose(fp);
return 0;
}
示例2:二进制文件操作(写入/读取结构体)
#include <stdio.h>
typedef struct {
int id;
char name[20];
} Student;
int main() {
Student s1 = {1, "Alice"}, s2;
// 写入二进制文件
FILE *fp = fopen("students.dat", "wb");
fwrite(&s1, sizeof(Student), 1, fp);
fclose(fp);
// 读取二进制文件
fp = fopen("students.dat", "rb");
fread(&s2, sizeof(Student), 1, fp);
printf("ID: %d, Name: %s\n", s2.id, s2.name);
fclose(fp);
return 0;
}
**五、文件定位与错误处理**
1. **文件定位**
- `fseek(FILE *stream, long offset, int origin);`:移动文件指针。
- `origin`:`SEEK_SET`(文件头)、`SEEK_CUR`(当前位置)、`SEEK_END`(文件尾)。
- `long ftell(FILE *stream);`:获取当前指针位置。
- `rewind(FILE *stream);`:重置指针到文件头。
2. **错误检查**
- 检查 `fopen()` 是否返回 `NULL`。
- 使用 `feof(FILE *stream)` 判断是否到达文件末尾。
- 使用 `ferror(FILE *stream)` 检查文件操作是否出错。
**六、注意事项**
1. **文件路径**:使用绝对路径或确保文件位于程序运行目录。
2. **模式选择**:避免误用 `"w"` 模式覆盖已有文件。
3. **关闭文件**:操作完成后必须关闭文件,防止资源泄漏。
4. **二进制与文本模式**:在Windows系统中,换行符需特殊处理(文本模式会自动转换 `\n` 为 `\r\n`)。
掌握文件操作后,可以实现数据持久化(如保存配置、日志记录等)。建议结合实际需求练习代码!