fgetpos(文件流指针,fpos_t*位置) | 获得文件当前读写位置,成功返回0,否则返回-1 |
fsetpos(文件流指针,const fpos_t*位置t) | 设置文件读写位置,成功返回0,否则返回-1 |
ftell(文件流指针) | 获得文件当前读写位置的偏移量,返回值为长整型 |
rewind(文件流指针) | 将文件指针从新指像一个流的开头 |
fpos_t类型是标准函数库定义的一种结构体,他也是文件流FILE结构中的一个成员
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h> //creat 头文件
#include <stdlib.h>
#define CTIME 3
struct inputvalue{
unsigned int length; //每次输出字符串的长度
fpos_t pos; //每次输出文件中的位置
};
int main ()
{
if(creat("textfile",0664)<0) //创建文件
{
perror("创建失败");
return 0;
}
struct inputvalue iv[CTIME];
int i;
FILE *fp;
fp=fopen("textfile","rw+");
if(fp==NULL)
{
perror("打开失败");
return 1;
}
for(i=0;i<CTIME;i++)
{
fgetpos(fp,&(iv[i].pos)); //获取文件当前读写位置 成功返回0 否则返回-1
iv[i].length=fprintf(fp,"第%d次输出的数据",i); //获取写入数据长度
}
fflush(fp); //立即将缓冲区的数据输入到文件中
printf("文件总长度%ld\n",ftell(fp)); //ftell 获取文件当前读写位移的偏移量
rewind(fp); //将文件指针重新指向一个流的开头
for(i=0;i<CTIME;i++)
{
fsetpos(fp,&(iv[i].pos)); //设置读写位置 成功返回0 失败返回-1
char *buf=malloc(iv[i].length+1);
*(buf+iv[i].length+1)='\0'; //缓冲区最后一个字符为终结符
fread(buf,iv[i].length,1,fp); //读到缓冲区
puts(buf); //输出
free(buf); //释放缓冲区
fclose(fp);
return 0;
}
注释:该代码实现的功能类似于文本编辑器里的撤销所做的工作