目录
在VS2022 WIN11环境下,使用rewind(stdin)可以解决问题,效果如下:
文件的随机读写
注明:点击函数可以跳转cplusplus网站!!!
函数fseek
根据文件指针的位置和偏移量来定位文件指针。
int fseek ( FILE * stream, long int offset, int origin );
#include<stdio.h>
int main()
{
FILE* pf = fopen("text.txt", "r ");
if (pf == NULL)
{
perror(pf);
return;
}
//读文件
//fgetc返回指定流的内部文件位置指示符当前指向的字符,然后,内部文件位置指示器将前进到下一个字符。
int ch = fgetc(pf);
printf("%c", ch);//a
ch = fgetc(pf);
printf("%c", ch);//b
ch = fgetc(pf);
printf("%c", ch);//c
ch = fgetc(pf);
printf("%c", ch);//d
ch = fgetc(pf);
printf("%c", ch);//e
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
效果如下:
现在指示器已经在f的位置,如果我们想要打印c,而不是按顺序读下去。那么就要用fseek
#include<stdio.h>
int main()
{
FILE* pf = fopen("text.txt", "r");
if (pf == NULL)
{
perror(pf);
return;
}
//读文件
//fgetc返回指定流的内部文件位置指示符当前指向的字符,然后,内部文件位置指示器将前进到下一个字符。
int ch = fgetc(pf);
printf("%c", ch);//a
ch = fgetc(pf);
printf("%c", ch);//b
ch = fgetc(pf);
printf("%c", ch);//c
ch = fgetc(pf);
printf("%c", ch);//d
ch = fgetc(pf);
printf("%c", ch);//e
//fseek(pf, 2, SEEK_SET);//起始位置开始
fseek(pf, -3, SEEK_CUR);//当前位置开始
//fseek(pf, -5, SEEK_END);//末尾开始
ch = fgetc(pf);
printf("%c", ch);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
画图分析:
效果如下:
函数ftell
返回文件指针相对于起始位置的偏移量
long int ftell ( FILE * stream );
#include<stdio.h>
int main()
{
FILE* pf = fopen("text.txt", "r");
if (pf == NULL)
{
perror(pf);
return;
}
//读文件
//fgetc返回指定流的内部文件位置指示符当前指向的字符,然后,内部文件位置指示器将前进到下一个字符。
int ch = fgetc(pf);
printf("%c", ch);//a
ch = fgetc(pf);
printf("%c", ch);//b
ch = fgetc(pf);
printf("%c", ch);//c
ch = fgetc(pf);
printf("%c", ch);//d
ch = fgetc(pf);
printf("%c", ch);//e
int a=ftell(pf);
printf("%d", a);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
画图分析:
当前指向的是f,相对于起始位置的偏移量为5
效果如下:
函数rewind
让文件指针的位置回到文件的起始位置 。
void rewind ( FILE * stream );
#include<stdio.h>
int main()
{