fseek
fseek这个函数的作用是什么?
我们知道,如果对一个文件指针进行加减操作的话,这个文件指针会指向下一个文件,那么问题来了,我们如果想访问这个文件中的某一个内容,这个时候该怎么办呢,我们又不能对这个文件指针进行加减操作。(因为你如果对这个文件指针进行加减操作,他就指向上一个或者下一个文件了)。
这个时候就可以用fseek这个函数了,它可以让你访问这个文件里的任何内容;
比如;
一个名叫test.dat的 文件中有这些内容: a b c d e f
当你用fopen(“test.dat”,"r")的只读形式来打开这个文件
并用:fgets(pf) 这个函数将这个文件的内容放进内存中,
你可以将放进内存的每个字母打印出来:
int ch = fget(pf);
printf("%c\n",ch);
int ch = fgetc(pf);
printf("%c\n",ch);//a
ch = fgetc(pf);
printf("%c\n", ch);//b
ch = fgetc(pf);
printf("%c\n", ch);//c
ch = fgetc(pf);
printf("%c\n", ch);//d
但这个时候,如果你不想打印下一个字母了,你想打印一下之前打印过的内容,
比如你想打印b,
这个时候就可以用fseek了;
看代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
//打开文件
FILE* pf = (FILE*)fopen("test.dat", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
int ch = fgetc(pf);
printf("%c\n",ch);//a
ch = fgetc(pf);
printf("%c\n", ch);//b
ch = fgetc(pf);
printf("%c\n", ch);//c
ch = fgetc(pf);
printf("%c\n", ch);//d
fseek(pf, -3, SEEK_CUR);
ch = fgetc(pf);
printf("%c\n", ch);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
看解析
看运行结果;
如果你因为文件指针走得太远而不知道偏移量咋办?
这个时候你可以用ftell
ftell这个函数可以告诉你文件指针相对起始位置的偏移量
看代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
//打开文件
FILE* pf = (FILE*)fopen("test.dat", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
int ch = fgetc(pf);
printf("%c\n",ch);//a
ch = fgetc(pf);
printf("%c\n", ch);//b
ch = fgetc(pf);
printf("%c\n", ch);//c
ch = fgetc(pf);
printf("%c\n", ch);//d
long int ret = ftell(pf);
printf("%d\n", ret);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
看运行结果
如何让文件指针回到起始位置——rewind
看代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
//打开文件
FILE* pf = (FILE*)fopen("test.dat", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
int ch = fgetc(pf);
printf("%c\n",ch);//a
ch = fgetc(pf);
printf("%c\n", ch);//b
ch = fgetc(pf);
printf("%c\n", ch);//c
ch = fgetc(pf);
printf("%c\n", ch);//d
rewind(pf); //rewind 可以让文件指针回到起始位置,
long int ret = ftell(pf);
printf("%d\n", ret); //因为我之前rewind,所以这里相对起始位置的偏移量就是0
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
看运行结果
文本文件和二进制文件
根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
一个数据在内存中是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2013测试)