C语言 文件操作 读写文本文件和二进制文件

发布时间:2025-04-28      访问量:32
以下是关于 **C语言文件操作** 的详细说明,包含基本概念、常用函数、示例代码及注意事项:

**一、文件操作基础**
在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`)。

掌握文件操作后,可以实现数据持久化(如保存配置、日志记录等)。建议结合实际需求练习代码!
堆内存
多线程
strdup
初始化器
冒泡排序
增删改查
BufferedReader
输入输出
面向对象
生命周期
闭包的概念
原型链
Flask
mysql-connector-python
单例模式
浅拷贝
隔离级别
索引
InnoDB
左连接
聚合函数
PuTTY
TRUNCATE
str_starts_with_many
DateTime
array_combine
闭包的概念