目录
📢1.文件的随机读写
📢fseek
📢📢只读模式
文件操纵使用 fgetc ,以只读模式访问文件时
默认会从第一个元素开始读取,然后向后访问,具体如下代码
//fseek函数的使用
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE* fp=fopen("test.txt","r");
if (fp == NULL)
{
printf("%s", strerror(errno));
return 0;
}
int ch = fgetc(fp);
printf("%c ", ch); //a
ch = fgetc(fp);
printf("%c ", ch); //b
ch = fgetc(fp);
printf("%c ", ch); //c
fclose(fp);
fp=NULL;
return 0;
}
怎样随机读取文件的字母
也就是说,读取c后下一个字母可以直接访问到 'f'
能实现这个功能的函数为fseek
fseek(fp, 2, SEEK_CUR);
ch=fgetc(fp);
printf("%c", ch);
fseek(fp, 5, SEEK_SET);
ch = fgetc(fp);
printf("%c", ch);
fseek(fp, -1, SEEK_END);
fseek |
头文件 #include <stdio.h> |
格式 int fseek ( FILE * stream, long int offset, int origin ) |
功能 通过偏移量来定位文件指针 |
返回值 如果成功,该函数返回零;否则,它将返回非零值。 |
这里第三个参数(origin)的起始位置有三种情况
参数 | 起始位置 |
SEEK_SET | 文件开头 |
SEEK_CUR | 文件指针当前位置 |
SEEK_CUR | 文件结束的位置 |
📢只写模式
📢通过fseek函数将‘y’改成‘&’
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE* fp=fopen("test.txt","w");
if (fp == NULL)
{
printf("%s", strerror(errno));
return 0;
}
int ch = 0;
for (ch = 'a'; ch <= 'z'; ch++)
fputc(ch, fp);
fseek(fp, -2, SEEK_CUR);
fputc('&', fp);
fp = NULL;
return 0;
}
📢ftell
当对文件进行读写模式的时候,有时候就会忘记文件指针指向的是哪里
或者说,距离起始位置的偏移量是多少,就要用到ftell函数
//ftell函数的使用
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE* fp=fopen("test.txt","r");
if (fp == NULL)
{
printf("%s", strerror(errno));
return 0;
}
int ch = fgetc(fp);//a
ch = fgetc(fp); //b
ch = fgetc(fp); //c
int Move = ftell(fp);
printf("距离起始位置的偏移量为:>% d", Move);
fclose(fp);
fp = NULL;
return 0;
}
ftell |
头文件 #include <stdio.h> |
格式 long int ftell ( FILE * stream ) |
功能 计算距离起始位置的偏移量 |
返回值 成功时,返回文件指针的当前值,失败时,返回 -1 |
📢fwind
当文件指针指向的位置不再是起始位置
可以通过fwind是指针返回到起始位置
//rewind函数的使用
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
FILE* fp=fopen("test.txt","r");
if (fp == NULL)
{
printf("%s", strerror(errno));
return 0;
}
int ch = fgetc(fp);//a
ch = fgetc(fp); //b
ch = fgetc(fp); //c
int Move = ftell(fp);
printf("距离起始位置的偏移量为:>% d\n", Move);
rewind(fp);
Move = ftell(fp);
printf("距离起始位置的偏移量为:>% d", Move);
fclose(fp);
fp = NULL;
return 0;
}
📢2.文本文件与二进制文件
文件数据的储存方式可以分为文本文件与二进制文件
内存中的数据都是以二级制的形式储存在内存中
如果将内存中的数据,不加以转化,输出到外存,就是二级制文件
如果以ASCll码的形式储存在外存,就称为文本文件
话句话说,一般情况,只要是你看得懂的文件都是文本文件,反之就是二进制文件
如果能用记事本打开并能理解其中的内容的文件就是文本文件
📢3.文件读取结束的判定
📢判断文件是否读取访问结束
📢文本文件
fgetc函数的返回值为EOF,可以判断文件的返回值是否为EOF来判断文件的状态
fputs函数的返回值为NULL,可以判断文件的返回值是否为空指针来判断文件的状态
📢二进制文件
fread函数可以判断文件元素读取的理论数量与实际返回值进行对比
如果此返回值与 count 参数不同,则表示读取时出现读取错误或到达文件末尾
fread |
头文件 #include <stdio.h> |
格式 size_t fread ( void * ptr, size_t size, size_t count, FILE * stream ) |
功能 从流中读取数据块 |
返回值 将返回成功读取的元素总数 |
📢判断文件结束的原因
原因可以使用feof函数来判断文件结束的原因
注:不能用feof来判断是否结束
下面给出判断文本文件结束的原因代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int c;//注意:int,非char,要求处理EOF
FILE* fp = fopen("test.txt", "r");
if (!fp) {
perror("File opening failed");
return EXIT_FAILURE;
}
//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
while ((c = fgetc(fp)) != EOF)
{
putchar(c);
}
//判断是什么原因结束的
if (ferror(fp))
puts("I/0 error when reading");
else if (feof(fp))
puts("End of file reached successfully");
fclose(fp);
fp == NULL;
return 0;
}
📢缓冲区
首先缓冲区的存在,是为了集中要处理的问题,进行一次性解决
就比如请教老师,可以先把需要请教的问题收集起来,进行一次性询问,这样可以避免浪费老师的时间,缓冲区的存在也是一样的原理,避免操作系统过于繁忙
如果需要快速处理这些数据
也可以刷新缓冲区,就是释放缓冲区这些问题,使这些数据快速得以读取和访问
强行(清空)刷新缓冲区的函数fflush
fflush |
头文件 #include <stdio.h> |
格式 int fflush ( FILE * stream ) |
功能 刷新缓冲区 |
返回值 如果写入错误就返回EOF,反之返回0 |
欢迎点赞收藏加关注,如若有问题可以提出来😁😁😁😁