### C语言第十三章知识点详解
#### 一、文件处理基础
**文本文件与二进制文件的区别**
- **文本文件特点**:
- 存储量大:由于文本文件存储的是可打印字符,因此通常占用空间较大。
- 速度慢:相比二进制文件,文本文件的读写速度较慢。
- 便于对字符操作:适用于需要进行字符处理的场景。
- **二进制文件特点**:
- 存储量小:二进制文件直接存储字节流,因此占用空间较小。
- 速度快:二进制文件读写效率高。
- 便于存放中间结果:适用于需要快速保存和读取数据的场景。
**文件处理方法**
- **缓冲文件系统**:高级文件系统,系统会自动为正在使用的文件分配内存缓冲区,提高读写效率。
- **非缓冲文件系统**:低级文件系统,需要用户在程序中为每个文件手动设置缓冲区,灵活性较高但管理复杂。
#### 二、文件类型指针与结构体
**文件结构体** `FILE`:
- 缓冲文件系统为每个正在使用的文件在内存中开辟一个文件信息区。
- 文件信息使用系统定义的名为 `FILE` 的结构体进行描述,该结构体定义在 `<stdio.h>` 头文件中。
- 典型结构成员包括:
- `_fd`:文件号。
- `_cleft`:缓冲区中剩余的字符数。
- `_mode`:文件的操作模式。
- `_next`:文件当前的读写位置。
- `_buff`:文件缓冲区的位置。
- 示例:
```c
FILE f[5];
```
**文件类型指针的使用**
- 定义:`FILE *fp;`
- 使用方法:
- 当文件打开时,系统会自动创建文件结构体,并将指向该结构体的指针返回给程序。
- 程序通过这个指针获取文件信息并对文件进行访问。
- 关闭文件后,相应的文件结构体会被释放。
#### 三、文件的打开与关闭
**C文件操作**
- C语言中的文件操作主要通过库函数实现,这些函数包含在 `<stdio.h>` 头文件中。
- 文件操作的基本流程是:打开文件 → 文件读/写 → 关闭文件。
**标准文件**
- 系统自动打开和关闭三个标准文件:
- 标准输入:键盘 (`stdin`)
- 标准输出:显示器 (`stdout`)
- 标准错误输出:显示器 (`stderr`)
**打开文件**
- 函数原型:`FILE *fopen(const char *filename, const char *mode);`
- 功能:按照指定的方式打开文件。
- 返回值:
- 如果文件正常打开,则返回指向文件结构体的指针。
- 如果文件打开失败,则返回 `NULL`。
- 示例:
```c
FILE *fp = fopen("aa.c", "w");
if (fp == NULL) {
printf("File open error!\n");
exit(0);
}
```
**关闭文件**
- 函数原型:`int fclose(FILE *stream);`
- 功能:关闭由 `stream` 指向的文件。
- 返回值:
- 如果文件正常关闭,则返回 `0`。
- 如果出现错误,则返回非零值(通常为 `EOF`,即 `-1`)。
- 示例:
```c
fclose(fp);
```
#### 四、文件的读写
**字符 I/O:`fputc` 与 `fgetc`**
- **`fputc`**
- 函数原型:`int fputc(int c, FILE *stream);`
- 功能:将一个字符 `c` 写入由 `stream` 指向的文件中。
- 返回值:
- 正常情况下,返回 `c`。
- 出错时,返回 `EOF`(通常为 `-1`)。
- **`fgetc`**
- 函数原型:`int fgetc(FILE *stream);`
- 功能:从由 `stream` 指向的文件中读取一个字节。
- 返回值:
- 正常情况下,返回读取的字符的 ASCII 值。
- 读到文件末尾或出错时,返回 `EOF`。
**示例代码**
- 将从键盘输入的字符逐个存储到磁盘文件中,直到输入 ‘#’ 为止。
```c
#include <stdio.h>
int main() {
FILE *fp;
char ch;
char *filename = "out.txt";
if ((fp = fopen(filename, "w")) == NULL) {
printf("Cannot open file\n");
exit(0);
}
printf("Please input string:");
ch = getchar();
while (ch != '#') {
fputc(ch, fp);
putchar(ch);
ch = getchar();
}
fclose(fp);
}
```
- 读取文本文件内容并显示。
```c
#include <stdio.h>
int main() {
FILE *fp;
char ch;
char *filename = "out.txt";
if ((fp = fopen(filename, "r")) == NULL) {
printf("Cannot open file\n");
exit(0);
}
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
fclose(fp);
}
```
**判断文件是否结束**
- 使用 `feof` 函数判断文件是否到达末尾。
- 函数原型:`int feof(FILE *stream);`
- 功能:判断文件是否已经到达末尾。
- 返回值:
- 如果文件到达末尾,则返回非零值。
- 否则返回 `0`。