**带你玩转C语言 - 17-文件操作文件基本概念 文件流 C 语言把文件看作是一个字符的序列 即文件是由一个一个字符组成的字符流 因此 c 语言将文件也称之为文件流 文件分类 文本文件 以 ASCII 码格式存放 一个字节存放一个字符 文本文件的每一个字节存放一个 ASCII 码 代表一个字符 这便于对字符的逐个处理 但占用存储空间 较多 而且要花费时间转换
大家好,我是讯享网,很高兴认识大家。
文件基本概念
- 文件流:
- 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;
| 函数声明 |
FILE * fopen ( const char * filename, const char * mode ); |
| 所在文件 |
stdio.h |
| 函数功能 |
以 mode 的方式,打开一个 filename 命名的文件,返回一个指向该文件缓冲的 FILE 结构体指针。 |
| 参数及返回解析 |
|
| 参数 |
char*filaname :要打开,或是创建文件的路径。 |
| 参数 |
char*mode :打开文件的方式。 |
| 返回值 |
FILE* 返回指向文件缓冲区的指针,该指针是后序操作文件的句柄。 |
| mode |
处理方式 |
当文件不存在时 |
当文件存在时 |
向文件输入 |
从文件输出 |
| r |
读取 |
出错 |
打开文件 |
不能 |
可以 |
| w |
写入 |
建立新文件 |
覆盖原有文件 |
可以 |
不能 |
| a |
追加 |
建立新文件 |
在原有文件后追加 |
可以 |
不能 |
| r+ |
读取/写入 |
出错 |
打开文件 |
可以 |
可以 |
| w+ |
写入/读取 |
建立新文件 |
覆盖原有文件 |
可以 |
可以 |
| a+ |
读取/追加 |
建立新文件 |
在原有文件后追加 |
可以 |
可以 |
注意点:
- Windows如果读写的是二进制文件,则还要加 b,比如 rb, r+b 等。 unix/linux 不区分文本和二进制文件
| 函数声明 |
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 |
| 函数功能 |
将 ch 字符,写入文件。 |
| 参数及返回解析 |
|
| 参数 |
FILE* stream :指向文件缓冲的指针。 |
| 参数 |
int : 需要写入的字符。 |
| 返回值 |
int 写入成功,返回写入成功字符,如果失败,返回 EOF。 |
讯享网#include <stdio.h> int main() { // 1.打开一个文件 FILE *fp = fopen("test.txt", "w+"); // 2.往文件中写入内容 for(char ch = 'a'; ch <= 'z'; ch++){ // 一次写入一个字符 char res = fputc(ch, fp); printf("res = %c\n", res); } // 3.关闭打开的文件 fclose(fp); return 0; }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/37136.html