一.文件的随机读写
1.fseek
int fseek(FILE* stream,long int offset,int origin);
//第一个参数文件流
//第二个参数偏移量
//偏移量如果是正数,向后偏移
//偏移量如果是负数,向前偏移
//第三个参数起始位置
fseek从当前光标指向的流中获取字符
SEEK_SET:文件的起始位置
SEEK_CUR:文件指针当前位置
SEEK_END:文件的结束位置
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读
char ch = fgetc(pf);
printf("%c\n", ch);//a
fseek(pf, 4, SEEK_SET);
//距文件起始位置4个偏移量
printf("%c\n", fgetc(pf));//e
//fseek(pf,5,SEEK_CUR);
//距当前文件位置5个偏移量
//printf("%c\n", fgetc(pf));//g
//fseek(pf,-6,SEEK_END);
//距文件末尾位置6个偏移量
//printf("%c\n",fgetc(pf));//d
fclose(pf);
pf = NULL;
return 0;
}
这是test.txt中的字符串
2.ftell
返回文件指针相对于起始位置的偏移量
long int ftell(FILE* stream);
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读
char ch = fgetc(pf);
printf("%c\n", ch);//a
int ret = ftell(pf);
printf("%d\n", ret);//1
fclose(pf);
pf = NULL;
return 0;
}
3.rewind
让文件指针的位置回到文件的起始位置
void rewind(FILE* stream);
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读
char ch = fgetc(pf);
printf("%c\n", ch);//a
int ret = ftell(pf);
printf("%d\n", ret);//1
rewind(pf);
//文件指针回到起始位置
printf("%c\n",fgetc(pf));//a
//打印a说明文件回到了起始位置
fclose(pf);
pf = NULL;
return 0;
}
二.文件读写结束的判定
文件现在读取结束了,但是是什么原因读取结束的呢?
1.可能是遇到了文件末尾
2.可能是读取的时候发生了错误
1.feof函数(不是用来判定文件结束的)
文件已经结束,用来判定文件结束的原因
feof的作用是:文件读取结束的时候,判断文件是否遇到文件末而结束的
feof没有读到文件末尾返回0,读到文件末尾返回非0值
int feof(FILE* stream)
//feof函数只需要关注传入的文件指针是否为NULL即可
2.ferror函数
文件已经结束,ferror读取的时候没有发生错误返回0,发生错误返回非0值
int ferror(FILE* stream)
//ferror函数只需要关注传入的文件指针是否为NULL即可
下面来举一个例子:
int main()
{
FILE* pf = fopen("test.txt", "r");
//打开文件
if (pf == NULL)
{
perror("fopen");
//打印错误
return 1;
//发生错误提前返回
}
//使用
char ch = 0;
while ((ch = fgetc(pf)) != EOF)
{
printf("%c ", ch);
}
printf("\n");
if (feof(pf))//返回非0值
{
printf("读到文件末尾而结束\n");
}
else if(ferror(pf))//返回非0值
{
printf("读取错误而结束\n");
perror("ferror");
}
fclose(pf);
//关闭文件
pf = NULL;
return 0;
}