【C语言】文件操作
这里写目录标题
- 文件
- 1.文件的打开和关闭
- 2.文件操作函数
- 1.字符操作函数
- 2.文本行操作函数
- 3.格式化输入输出
- 4.二进制输入输出
- 5.文件的随机读写
- fseek
- ftell
- rewind
- 3.文本文件和二进制文件
- 4.文件读取结束的判定
- 5.文件缓冲区
文件
- 使用文件可以将数据直接存放再电脑的硬盘上,实现数据持久化
- 按功能分为程序文件(.c .obj .exe),和数据文件(内容为程序运行时读取的数据),这里文件操作是对于数据文件而言
1.文件的打开和关闭
- 被使用的文件会在内存中开辟一个文件信息区,是一个FILE结构体变量,记录文件相应信息,在文件打开时由系统自动创建并填充信息,一般用FILE*来维护
- 打开和关闭通过 fopen 和 fclose 实现
- 若打开失败,则返回NULL,注意检查返回值
- 文件读取方式 “r” 在文件不存在时报错,“w” 和 “a” 在文件不存在时自动创建
FILE* pf = fopen("test.txt", "r");
if( pf == NULL )
{
perror("fopen");
return 1;
}
....
fclose(pf);
pf = NULL;
2.文件操作函数
流(stream):
运行C语言程序时,会默认打开3个FILE*类型的流,stdin(标准输入流),stdout(标准输出流),stderr(标准错误流)
1.字符操作函数
fputc
将内存中的字符输出(写入)到文件,返回值为ASCII值或EOF
fgetc
从文件中读取字符输入至内存,每次读取成功pf向后偏移一个字符
对标准输入输出流操作
int ch = fgetc(stdin);
fputc('a', stdout);
2.文本行操作函数
参数string为字符数组的地址
读取n-1个字符,会向*string放入’\0’
3.格式化输入输出
- scanf,针对标准输入流(stdin)的格式化输入语句
- fscanf,针对所有输入流(stdin,文件流)的格式化输入语句
- sscanf,从一个字符串中读取格式化的数据
- printf,针对标准输出流(stdout)的格式化输出语句
- fprintf,针对所有输出流(stdout,文件流)的格式化输出语句
- sprintf,把格式化的数据转换成字符串
sscanf 和 sprintf 可用于序列化和反序列化,可用于一些字符串与类型数据转换
4.二进制输入输出
只使用于文件,字符串中二进制写入和文本写入一样
fread 以二进制读取数据
fwrite 将数据以二进制写入
5.文件的随机读写
fseek
根据相对偏移量重新定位文件指针
- 偏移量为相对起始(SEEK_SET)、当前(SEEK_CUR)、末尾(SEEK_END)的偏移量
打开存有 abcdef 的文件
fgetc 读取时也会自动偏移
ftell
返回文件指针相对于起始位置的偏移量
- 以 long int 返回当前位置偏移量
rewind
让文件指针的位置回到文件的起始位置
3.文本文件和二进制文件
二进制文件:内存中的数据是以二进制形式存储的,不加转换直接输入到外存
文本文件:内存中的数据从二进制转换为ASCII值,以ASCII值形式存储到外存
如有整数10,以二进制形式存储占4个字节(整型),以ASCII值存储占2个字节(一个字符一个字节,字符’1’和字符’0’)
4.文件读取结束的判定
在文件读取结束时(末尾结束或错误结束),使用 feof
、ferror
来判断文件读取结束的原因
feof(pf)
返回真则文件读取到末尾结束,ferror(pf)
为真则发生错误读取结束
关于 fgetc 和 fgets 读取结束的返回值
fgetc 在读取到文件末尾和遇到错误读取结束时都会返回EOF,遇到文件末尾返回EOF同时会设置一个状态,这个状态用 feof 来检测,遇到错误返回EOF同时也会设置一个状态,这个状态用 ferror 来检测
fgets 在读取到文件末尾和遇到错误读取结束时都会返回NULL,遇到错误返回NULL同时同样也会设置一个状态,这个状态用 ferror 来检测
5.文件缓冲区
当写数据到文件中时,并不会直接写到文件中,而是先将数据放到输出缓存区,在缓存区刷新(fclose
关闭文件时刷新或者fflush
主动刷新)时才会将其中的数据写入文件中,同样从文件中读取数据输入到内存中时,也会先将数据放到输入缓冲区,缓冲区刷新时才会将数据输入到内存中
如使用 fwrite 写数据
用户程序调用由操作系统提供的子功能集合叫做系统调用