文章目录
前言
在之前,我讲过文件的顺序读写。但是我们可不可以随机读写文件呢?答案是当然可以的,只要我们合理的控制文件指针的位置(光标),就能够读取到我们想要读取的数据。
C语言给我们提供了随机读写文件的函数,只要我们能够合理的运用它们,就能够实现我们要达到的效果。
那么,今天我们就来一起探讨一下随机文件读取函数!!!
1. fseek
fseek函数的作用:重新定位光标的位置。
一般来说,我们打开一个文本文件,文件的光标位置都会处在文件内容最开始的位置,也就是如下的样子:
那我们运用fseek函数,就能够按照我们的意愿随意改变光标出现的位置,然后在开始读取文件的内容。
1.1 fseek函数原型
如果fseek函数执行成功,则返回0 。否则返回一个非0值。
1.2 fseek函数的形式参数
这里我要重点讲解一下fseek函数的形式参数。
形参名 | 作用 |
---|---|
steam | 文件指针变量 |
offset | 光标的偏移量 |
origin | 设置光标的起始位置 |
看到offset这个变量名时,不知道大家有没有想起,我在结构体内存对齐的那边文章中用了一个offsetof函数检测了结构体成员相对于起始位置的偏移量。
而offset则是光标位置相对于设置光标起始位置之后的偏移量。
那对于origin变量,C编译器给我们提供了3个宏,它们分别是:
宏 | 作用 |
---|---|
SEEK_SET | 将光标重置到文件开头的位置 (比较常用) |
SEEK_CUR | 将光标重置到当前文件内容的最末尾位置 (比较常用) |
SEEK_END | 将光标重置到文件结束标志的后面 |
1.3 fseek实例演示
//fseek函数的实例演示
//现在我有一个文件test4.txt,内容为26个英文字母。现在我只想读取从字母m之后的所有字母,并打印到屏幕上。
int main()
{
char ch = 0;
int count = 0;
FILE* pf = fopen("test4.txt","r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
while (ch = fgetc(pf))
{
if (ch == 'm')
{
break;
}
count++;
}
fseek(pf,count,SEEK_SET);
while ((ch = fgetc(pf)) != EOF)
{
fprintf(stdout,"%c",ch);
}
fclose(pf);
pf = NULL;
return 0;
}
2. ftell
ftell函数的作用:告诉我们目前光标的位置,从0开始。
2.1 ftell函数原型
ftell函数如果执行失败,则返回-1 。
2.2 ftell函数的实例演示
int main()
{
char ch = 0;
FILE* fp = fopen("test4.txt","r");
if (fp== NULL)
{
perror("fopen");
return 1;
}
ch = fgetc(fp);
printf("%d\n", ftell(fp));
ch = fgetc(fp);
printf("%d\n", ftell(fp));
fclose(fp);
fp = NULL;
return 0;
}
3. rewind
rewind函数的作用:将光标中重置到文件最开头的位置,也就是ftell读取值为0的地方。
3.1 rewind函数原型
3.2 rewind函数实例演示
//rewind函数
int main()
{
char ch = 0;
FILE* fp = fopen("test4.txt","r");
if (fp== NULL)
{
perror("fopen");
return 1;
}
ch = fgetc(fp);
printf("%c\n",ch);
printf("%d\n", ftell(fp));
rewind(fp);
ch = fgetc(fp);
printf("%c\n", ch);
printf("%d\n", ftell(fp));
fclose(fp);
fp = NULL;
return 0;
}