根据文件指针的位置和偏移量来定位文件指针。
int fseek ( FILE * stream, long int offset, int origin );
//fseek
int main()
{
//打开文件
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
printf("fopen");
return 1;
}
//操作文件
fseek(pf, 2, SEEK_SET);
char a = fgetc(pf);
printf("%c ", a);
fseek(pf, -2, SEEK_END);
a = fgetc(pf);
printf("%c ", a);
fseek(pf, -2, SEEK_CUR);
a = fgetc(pf);
printf("%c ", a);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
结果展示
如图所示,SEEK_SET 所指的位置是 ① ,偏移 2 个单位,指向第一个 l ,让后第一个结果为 l;
SEEK_END 所指的位置是 ② ,偏移 -2 个单位,指向 o ,第二个结果是 o;
SEEK_CUR 所指的位置是 ③ ,因为当 fgetc() 函数使用后指针会自动向后偏移一个单位, 然后又向前偏移 2 个单位, 结果是 a.
返回文件指针相对于起始位置的偏移量。
long int ftell ( FILE * stream );
//ftell
int main()
{
long int num = 0;
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
printf("fopen");
return -1;
}
fseek(pf, 0, SEEK_END);
num = ftell(pf);
printf("%ld\n", num);
fclose(pf);
return 0;
}
让文件指针的位置回到起始位置。
void rewind ( FILE * stream );
//rewind
int main()
{
FILE* pf = fopen("test.txt", "w+");
if (pf == NULL)
{
perror("fopen");
return -1;
}
for (int i = 'a'; i < 'f'; i++)
{
fputc(i, pf);
}
fputc('\0', pf);
rewind(pf);
char arr[10];
fgets(arr, 10, pf);
printf("%s\n", arr);
fclose(pf);
pf = NULL;
return 0;
}
结果展示
当我们需要指针返回起始的位置或者是文件指针不知道指向哪里,我们都能将他们返回起始位置。
用于判断文件是真的读到文件结束,还是读取失败。
int feof ( FILE * stream );
//feof
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return -1;
}
char a;
while ((a = fgetc(pf)) != EOF)
{
;
}
if (feof(pf))
{
printf("读取成功!\n");
}
else if (ferror(pf))
{
//printf("读取失败!\n");
perror("Error reading test.txt");
}
return 0;
}
结果展示
在这里,feof 用于判断是否真正读到文件的末尾,如果是将返回非零的值,输出读取成功!;如果是因为错误而返回 EOF ,feof 的返回值为0,并设置了错误码,我们可以利用错误码输出相关的错误信息。
ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变等)。缓冲区的大小根据C编译系统决定的。
//文件缓冲区的概念
int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
perror("fopen");
return -1;
}
fputs("asdfg", pf);
fclose(pf);
pf = NULL;
return 0;
}
只有当程序结束或文件缓冲区满的时候数据才能读写到文件中。
希望大家多多支持与鼓励!!!