文件的随机读写
fseek
根据文件指针的位置和偏移量来定位文件指针。
int fseek ( FILE * stream, long int offset, int origin );
- offset: 二进制文件:从原点偏移的字节数;文本文件:不是0,就是 ftell() 函数返回的值。
- origin: 用作偏移量的参考位置。SEEK_SET 代表文件的起始位置;SEEK_END 代表文件的末尾;SEEK_CUR 代表文件指针的当前位置。
- 返回值:如果成功,将返回 0 ;如果失败将返回非零的值,并设置错误码。
//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.
ftell
返回文件指针相对于起始位置的偏移量。
long int ftell ( FILE * stream );
- 如果返回成功,将返回相对起始位置的偏移量;如果失败,将返回 -1L ,并设置错误参数。
//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;
}
结果展示
文件的末尾偏移量为 5。
rewind
让文件指针的位置回到起始位置。
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;
}
结果展示
当我们需要指针返回起始的位置或者是文件指针不知道指向哪里,我们都能将他们返回起始位置。
文件读取结束的判定
feof
用于判断文件是真的读到文件结束,还是读取失败。
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;
}
调试过程
只有当程序结束或文件缓冲区满的时候数据才能读写到文件中。
通讯录练习
下面是一篇练习,通讯录文件版针对C语言文件操作的相关知识,所进行的练习。
总结
希望大家多多支持与鼓励!!!