老规矩笔记自取~:文件操作进阶笔记
❤️欢迎喜欢学习C/C++的朋友互关一起努力!!❤️
根据文件指针的位置和偏移量来定位文件指针
改变原文件指针指向的位置
int fseek( FILE *stream, long offset, int origin );
参数:文件地址,偏移量,起始位置
这里的起始位置
分为
SEEK_CUR 当前位置
Current position of file pointer
SEEK_END 文件字符的末位(最后一个字符的下个位置)
End of file
SEEK_SET 文件起始位置(第一个字符的起始位)
Beginning of file
偏移量右正左负
返回值:成功返回,0
用一段代码感受:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
int main()
{
//FILE* fp = fopen("C:\\Users\\yujing wang\\Desktop\\test.txt", "w");//写入
FILE* fp = fopen("C:\\Users\\yujing wang\\Desktop\\test.txt", "r");//读取
if (fp == NULL)
{
perror("fopen");
return -1;
}
//fputs("abcde", fp);//写入abc
fseek(fp, 1, SEEK_SET);//第二个字符
printf("%c", fgetc(fp));
fseek(fp, 0, SEEK_CUR);//与上面一样
printf("%c", fgetc(fp));
fseek(fp, -1, SEEK_END);//最后一个字符
printf("%c", fgetc(fp));
fclose(fp);
fp = NULL;
return 0;
}
运行结果和想象的一样
返回文件指针相对于起始位置的偏移量
方便我们知道现在文件指针指向哪个位置
long int ftell ( FILE * stream );
参数:文件地址
返回值:偏移量
还是一段代码搞起~
#include
#include
int main()
{
FILE* fp = fopen("C:\\Users\\yujing wang\\Desktop\\test.txt", "r");//读取
if (fp == NULL)
{
perror("fopen");
return -1;
}
fseek(fp, 1, SEEK_SET);//指向第二个字符
printf("%ld", ftell(fp));
fclose(fp);
fp = NULL;
return 0;
}
结果符合我们的猜想
让文件指针的位置回到文件的起始位置
void rewind ( FILE * stream );
参数:文件地址
返回值:NULL
把刚才的代码再加一行
int main()
{
FILE* fp = fopen("C:\\Users\\yujing wang\\Desktop\\test.txt", "r");//读取
if (fp == NULL)
{
perror("fopen");
return -1;
}
fseek(fp, 1, SEEK_SET);//指向第二个字符
rewind(fp);
printf("%ld", ftell(fp));
fclose(fp);
fp = NULL;
return 0;
}
运行结果
偏移量变为0了
二进制文件
:数据在内存中以二进制的形式存储,如果不加转换的输出到外存
文本文件
:以ASCII字符的形式存储的文件,如果要求在外存上以ASCII码的形式存储,则需要在存储前转换
一个数据在内存中是怎么存储的呢?
在文件读取过程中,
不能
用feof函数的返回值直接用来判断文件的是否结束
该函数应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束
✨feof的用途:是文件读取结束了,判断是不是
遇到文件末尾而结束
✨ferror的用途:文件读取结束了,判断是不是遇到
错误后读取结束
读取结束
返回EOF
读取结束
返回NULL
✨ANSIC标准采用“缓冲文件系统”处理的数据文件的
✨缓冲文件系统是指系统自动地在内存中为程序中为每一个正在使用的文件,开辟一块“文件缓冲区”
。从内存向磁盘输出数据会先送到内存中的缓冲区
,装满缓冲区
后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。
如图所示
其实,在之前的学习过程中,就已经接触了内存缓存区
int main() { int a = 0; while ((a = getchar()) != EOF) { if (('a' <= a && a <= 'z') || ('A' <= a && a <= 'Z')) { printf("YES\n"); } else { printf("NO\n"); } getchar();//将每次的'\n'除去 } return 0; }
这里的getchar就是将
缓冲区未输出
的数,取出来
缓冲区的大小根据C编译系统决定的。
✨正因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区(fflush)
或者在文件操作结束的时候关闭文件(fclose)