16 文件操作
嵌入式开发中基本用不上,这章不重要
a
字符集:泛泛意义上的文本文件中的数据与磁盘中保存的二进制之间的映射关系。
常见的字符集:ASCLL,Latin,GB2312,GBK,UTF-8
解码过程:从看不懂到看得懂的过程。
如果操作时文本文件,则对应的时解码集。
编码过程:解码时逆过程,从看得懂的转换为看不懂的过程。
如果操作的是文本文件,则对应的解码集。
乱码问题:由于我们解码时使用的字符集不是当初编码时使用的字符集导致的!
避免乱码:解码时使用的字符集必须与当初编码时使用的字符集一致。
C程序中,文件中数据的输入/输出操作以“流”的方式进行,可以看做是一种数据的流动。
输入流:数据从数据源(文件,键盘)到程序(内存)的传输路径
输出流:数据从程序(内存)到数据源(文件,屏幕等)传输路径
要站在内存的角度
16.2.2 标准文件
标准文件 | 文件指针 | 设备 |
---|---|---|
标准输入 | stdin | 键盘 |
标准输出 | stdout | 屏幕 |
标准错误 | stderr | 屏幕 |
16.2.4 getchar()和putchar()
getchar()函数是从标准输入流读取一个字符,在同一个时间内只会读取一个单一的字符。
int getchar(void);
putchar()函数将一个字符写入到标准输入流,这个字符在同一时间只会输出一个单一的字符。
int putchar(int character);
16.2.5 gets()和puts函数
gets()函数是从标准输入流读取一行文本,并将其存储在一个字符数组中,直到遇到换行为止。
char *gets(char *str);
puts()函数用于将字符串输出到标准输出流,并自添加换行符,它接受一个资格字符作为参数,并显示在屏幕上。
int puts(const char *str);
写入失败他会返回一个特殊值EOF,EOF是一个定义在stdio.h头文件的常量,他的值是-1.
写入成功,会返回写入的字符数。
16.3 文件读写
16.3.1 打开文件
fopen():来创建一个新的文件,或者打开一个已有的文件(有该文件就打开,没有该文件就创建再打开)
头文件:
stdio.h
FILE *fopen(const char *filename,const char *mode);
FILE *表示文件流,如果打开失败就会返回一个空指针(NULL)
mode是指文件打开的模式
模式 | 描述 |
---|---|
r | 只读模式 |
w | 只写模式:文件存在,清楚文件的内容从头写,如果文件不存在,创建一个新文件从头写。 |
a | 追加模式:文件不存在会创建一个新的文件,文件存在,会在文件内容后面追加写入。 |
rb | 只读二进制模式 |
wb | 只写二进制模式:文件存在,清楚文件的内容从头写,如果文件不存在,创建一个新文件从头写。 |
ab | 追加二进制模式:文件不存在会创建一个新的文件,文件存在,会在文件内容后面追加写入。 |
r+ | 读写模式 |
w+ | 读写模式:文件存在,清楚文件的内容从头写,如果文件不存在,创建一个新文件从头写。 |
a+ | 读写模式:文件不存在会创建一个新的文件,文件存在,会在文件内容后面追加写入。 |
rb+ | 读写二进制模式:打开一个二进制文件,允许读写文件。 |
r+b | 读写二进制模式:打开一个二进制文件,允许读写文件。 |
wb+ | 读写二进制模式:打开一个二进制文件,从头读写文件。如果文件不存在,则会创建一个新文件并读写;如果文件存在,则清空文件并从头读写。 |
w+b | 读写二进制模式:打开一个二进制文件,从头读写文件。如果文件不存在,则会创建一个新文件并读写;如果文件存在,则清空文件并从头读写。 |
ab+ | 读写二进制模式:打开一个二进制文件,读取或追加写入文件。如果文件不存在,则会创建一个新文件并读写;如果文件存在,读取或在已有内容后面追加写入。 |
a+b | 读写二进制模式:打开一个二进制文件,读取或追加写入文件。如果文件不存在,则会创建一个新文件并读写;如果文件存在,读取或在已有内容后面追加写入。 |
16.3.2 关闭文件
fclose()
头文件
stdio.h
int fclose(FILE *stream);
返回一个整数值,表示成功
返回EOF,失败
16.3.3 写入文件
fputc():逐字符写入文件
头文件
stdio.h
int fput(int character,FILE *stream);
写入失败返回EOF
fputs()将字符串写入文件
stdio.h
int fputs(const char *str,FILE *stream);
写入失败返回EOF
fprintf()格式化写入文件
头文件
stdio.h
int fprintf(FILE *stream,const char *format,...);
写入失败返回EOF
16.3.4 读取文件
fgetc()用于从文件中逐字符读取。
stdio.h
int fgetc(FILE *stream);
读取失败,返回EOF
fgets():从文件中逐行读取,遇到换行符结束,读取的内容包括换行符。
stdio.h
char *fgets(char *str,int num,FILE *stream);
读取失败,返回一个空指针
fscanf():从文件中解析数据并存储到变量中,使用空白字符(空格、制表符、换行符等)分隔内容赋值给不同的变量。
stdio.h
int fscanf(FILE *stream, const char *format, ...);
读取失败返回EOF