C语言 第十章 文件操作
第十章 文件操作
文件
文本文件
也称ASCII码文件,每字符占一个字节存储,每字节保存的是字符的ASCII码。可用文本编辑器打开查看,例如.txt
、代码源程序.c
、等等
二进制文件
以二进制编码的形式保存,例如可执行文件(.exe
)、位图文件(.bmp
)、word文件(.docx
)等都属于二进制文件。这种文件不能用文本编辑器打开查看,强行打开会乱码,无法读懂。
优点:
“全部看作二进制”,输入输出的开始和结束由程序控制而不受换行、空格等字符的限制;比文本文件一般体积小,节省存储空间。
文件的读写
文件操作步骤
1 | // 定义文件指针 |
向文件写入字符串
如果文件事先已经存在,则会被删除重;如不存在,则直接新建。
fprintf()
为写入文件
1 |
|
fopen(char *filename, char *mode)
filename
:要打开的文件名称
mode
:文件访问模式
mode | introduce | remark |
---|---|---|
r | 允许读文件(read ) | 文件必须存在,否则出错 |
w | 允许覆盖写文件(write ) | 文件必须被新建(如文件已存在会删除源文件,然后新建) |
a | 允许追加写文件(append ) | 文件不存在时才新建,否则只在源文件末尾添加数据 |
+ | 即允许读也允许写文件 | |
b | 以二进制格式打开文件(binary ) | |
t | 以文本格式打开文件(text ) |
C语言常用文本文件读写函数
函数 | 功能 | 用法 |
---|---|---|
fgetc或getc | 从当前位置指针处读取文件中的一个字符(1个字符占1个字节),读取后,读写位置指针自动后移1字节 | 字符变量=fgetc(fp); |
fputc或putc | 在当前位置指针处向文件中写入一个字符(1个字符占1个字节),写入后,读写位置指针自动后移1字节 | fputc(字符, fp); |
fgets | 读取文件中的一个字符串,读写位置指针自动后移 | fgets(字符数组名, n, fp); |
fputs | 在当前位置指针处向文件中写入一个字符串(不写入’\0’字符,最后也不自动加’\n’);写入后,位置指针自动后移该字符串长度的字节。 | fputs(字符串首地址, fp); |
fscanf | 从当前位置指针处按格式读取文件中的多个数据,类似于scanf,只不过不是从键盘输入,而是从文件中读取;读取后,位置指针自动后移 | fscanf(fp, “格式控制字符串”, 变量1的地址, 变量2的地址, …); |
fprintf | 在当前位置指针处按格式向文件中写入多个数据,类似于printf,只不过不是显示到屏幕上,而是写入到文件中;写入后,位置指针自动后移 | fprintf(fp, “格式控制字符串”, 数据1, 数据2, …); |
C语言常用二进制文件读写函数
函数 | 功能 | 用法 |
---|---|---|
fread | 从当前位置指针处读取文件中的一批字节,这批字节由count个数据块、每数据块长size个字节组成,共size*count个字节。所读取的字节存入参数buffer地址开始的一段内存空间。读取后,文件位置指针跟随后移实际读取的字节数。函数返回实际读取的数据块数(如读到文件尾或出错,实际读取的数据块数可能小于count) | fread(buffer, size, count, fp); |
fwrite | 在当前位置指针处向文件中写入一批字节,这批字节位于内存中参数buffer地址开始的一段内存空间,由count个数据块、每数据块长size个字节组成,共size*count个字节。写入后,文件位置指针跟随后移实际写入的字节数。函数返回实际写入的数据块数(如写入出错,实际写入的数据块数可能小于count) | fwrite(buffer, size, count, fp); |
C语言常用文件位置指针定位库函数
函数 | 功能 | 用法 |
---|---|---|
rewind | 把文件位置指针移到文件开头 | rewind(fp); |
fseek | 把文件位置指针从ori开始的位置,向文件尾部(n>0时)或文件首部(n<0时)移动n个字节。ori可有3种取值: 0、1、2分别表示从文件首、当前位置和文件尾开始移动, 0、1、2也可分别写为符号常量SEEK_SET、SEEK_CUR、SEEK_END | fseek(fp, n, ori); 一般n为long型,常量加字母后缀L(l) |
ftell | 若执行成功,函数返回当前文件位置指针的位置(文件中第一个字节的位置为0);若执行失败,函数返回-1 | n = ftell(fp); |
feof | 判断读文件是否已越过了文件末尾 | if (feof(fp) ) … |