C语言文件操作(二)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
文件的随机读写
fseek函数
#include <stdio.h>
int main()
{
FILE* pf = fopen("test.txt", "r");
if (NULL == pf)
{
perror("fopen");
return 1;
}
char ch = fgetc(pf);
printf("%c\n", ch);
fseek(pf, 2, SEEK_SET);
ch = fgetc(pf);
printf("%c\n", ch);
return 0;
}
fseek的作用是调整文件读取的位置
ftell函数
ftell函数是用来计算偏移量的偏移量可以知道下次文件读取的读取位置
#include <stdio.h>
int main()
{
FILE* pf = fopen("test.txt", "r");
if (NULL == pf)
{
perror("fopen");
return 1;
}
char ch = fgetc(pf);
printf("%c\n", ch);
fseek(pf, 4, SEEK_SET);
ch = fgetc(pf);
printf("%c\n", ch);
int tmp = ftell(pf);
printf("%d\n", tmp);
return 0;
}
计算的偏移量为5
rewind函数
rewind函数的作用是回到文件的起始位置
文本文件和二进制文件
数据在内存中以二进制的形式存储如果不加转换的输出到外存就是二进制文件
数据在内存中以ASCII码的形式存储的文件就是·文本文件在存储的时候需要转换。
二进制存储大家一定很熟悉了
ASCII码形式的存储是怎么回事
ASCII形式的存储就是存数据的ASCII码
文件读取结束的判定
fgetc结束返回EOF
fgets结束返回NULL
fread结束返回一个值这个值小于要读取的个数
被误解的feof函数
feof是用来判断文件读取结束得时候是遇到文件结尾结束的还是读取失败结束的。
用if+feof判断文件读取结束是读取失败还是到文件结尾结束的
iffeof如果是真说明是到文件结束
ifferror如果是真说明是读取失败然后文件结束的
文件缓冲区
ANSIC 标准采用“缓冲文件系统”处理的数据文件的所谓缓冲文件系统是指系统自动地在内存中为程序
中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区装
满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据则从磁盘文件中读取数据输入到内存缓
冲区充满缓冲区然后再从缓冲区逐个地将数据送到程序数据区程序变量等。缓冲区的大小根
据C编译系统决定的。
在C语言文件操作的时候我们需要刷新缓冲区如果不做可能导致文件的读写失败
我们fclose关闭文件的时候可以刷新缓冲区我们也可以通过fflush函数刷新缓冲区
我们的测试代码为
#include <stdio.h>
#include <windows.h>
//VS2019 WIN11环境测试
int main()
{
FILE* pf = fopen("test.txt", "w");
fputs("abcdef", pf);//先将代码放在输出缓冲区
printf("睡眠10秒-已经写数据了打开test.txt文件发现文件没有内容\n");
Sleep(10000);
printf("刷新缓冲区\n");
fflush(pf);//刷新缓冲区时才将输出缓冲区的数据写到文件磁盘
//注fflush 在高版本的VS上不能使用了
printf("再睡眠10秒-此时再次打开test.txt文件文件有内容了\n");
Sleep(10000);
fclose(pf);
//注fclose在关闭文件的时候也会刷新缓冲区
pf = NULL;
return 0;
}