(编写中)文件输入输出
与文件进行通信
标准I/O
一个简单的文件压缩程序
文件基本概念
- 文件流:
- C 语言把文件看作是一个字符 的序列,即文件是由一个一个字符组成的字符流,因此 C 语言将文件也称之为文件流。
- 文件分类
-
文本文件
-
以 ASCII 码格式存放,一个字节存放一个字符。
文本文件的每一个字节存放一个 ASCII 码,代表一个字符。这便于对字符的逐个处理,但占用存储空间较多,而且要花费时间转换。 -
.c 文件就是以文本文件形式存放的
-
二进制文件
-
以补码格式存放。二进制文件是把数据以二进制数的格式存放在文件中的,其占用存储空间较少。
数据按其内存中的存储形式原样存放 -
.exe 文件就是以二进制文件形式存放的
- 文本文件和二进制文件示例
- 下列代码暂时不要求看懂, 主要理解什么是文本文件什么是二进制文件
#include <stdio.h>
int main()
{
/*
* 以文本形式存储
* 会将每个字符先转换为对应的 ASCII,
* 然后再将 ASCII 码的二进制存储到计算机中
*/
int num = 666;
FILE *fa = fopen("ascii.txt", "w");
fprintf(fa, "%d", num);
fclose(fa);
/*
* 以二进制形式存储
* 会将 666 的二进制直接存储到文件中
*/
FILE *fb = fopen("bin.txt", "w");
fwrite(&num, 4, 1, fb);
fclose(fb);
return 0;
}
-
内存示意图

-
通过文本工具打开示意图

- 文本工具默认会按照 ASCII 码逐个直接解码文件, 由于文本文件存储的就是 ASCII 码, 所以可以正常解析显示, 由于二进制文件存储的不是 ASCII 码, 所以解析出来之后是乱码
文件的打开和关闭
- FILE 结构体
- FILE 结构体是对缓冲区和文件读写状态的记录者,所有对文件的操作,都是通过 FILE 结构体完成的。
struct _iobuf {
char *_ptr; //文件输入的下一个位置
int _cnt; //当前缓冲区的相对位置
char *_base; //文件的起始位置)
int _flag; //文件标志
int _file; //文件的有效性验证
int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
int _bufsiz; // 缓冲区大小
char *_tmpfname; //临时文件名
};
typedef struct _iobuf FILE;
- fileopen 函数
| 函数声明 | FILE _ fopen ( const char _ filename, const char * mode ); |
|---|---|
| 所在文件 | stdio.h |
| 函数功能 | 以 mode 的方式,打开一个 filename 命名的文件,返回一个指向该文件缓冲的 FILE 结构体指针。 |
|参数及返回解析 |参数| charfilaname :要打开,或是创建文件的路径。| |参数| charmode :打开文件的方式。| |返回值| FILE* 返回指向文件缓冲区的指针,该指针是后序操作文件的句柄。|
| mode | 处理方式 | 当文件不存在时 | 当文件存在时 | 向文件输入 | 从文件输出 |
|---|---|---|---|---|---|
| r | 读取 | 出错 | 打开文件 | 不能 | 可以 |
| w | 写入 | 建立新文件 | 覆盖原有文件 | 可以 | 不能 |
| a | 追加 | 建立新文件 | 在原有文件后追加 | 可以 | 不能 |
| r+ | 读取/写入 | 出错 | 打开文件 | 可以 | 可以 |
| w+ | 写入/读取 | 建立新文件 | 覆盖原有文件 | 可以 | 可以 |
| a+ | 读取/追加 | 建立新文件 | 在原有文件后追加 | 可以 | 可以 |
注意点:
- Windows 如果读写的是二进制文件,则还要加 b,比如 rb, r+b 等。Unix/Linux 不区分文本和二进制文件
- fclose 函数
| 函数声明 | int fclose ( FILE * stream ); |
|---|---|
| 所在文件 | stdio.h |
| 函数功能 | fclose()用来关闭先前 fopen()打开的文件. |
| 函数功能 | 此动作会让缓冲区内的数据写入文件中, 并释放系统所提供的文件资源 |
| 参数及返回解析 | |
| 参数 | FILE* stream :指向文件缓冲的指针。 |
| 返回值 | int 成功返回 0 ,失败返回 EOF(-1)。 |
#include <stdio.h>
int main()
{
FILE *fp = fopen("test.txt", "w+");
fclose(fp);
return 0;
}
--
一次读写一个字符
- 写入
| 函数声明 | int fputc (int ch, FILE * stream ); |
|---|---|
| 所在文件 | stdio.h |
| 函数功能 |