C语言fgetpos()函数:获得当前文件的读写指针(转)
头文件:#include<stdio.h>
fgetpos()函数获得当前文件的指针所指的位置,并把该指针所指的位置信息存放到pos所指的对象中。pos以内部格式存储,仅由fgetpos()和fsetpos()使用。fsetpos()的功能与fgetpos()相反,用来设置当前文件的指针。fgetpos()的原型为:
int fgetpos( FILE *fp, fpos_t *pos );
【参数】fp为当前文件流的指针,pos为指向fpos_t类型的指针。
fpos_t是用来表示文件读写指针位置的类型,用来指明正在操作的文件中读或写的位置,文件头处为0。fpos_t在不同的平台下有不同的类型。
在windows下,fpos_t是一个64位整数,可以直接赋值,如fpos_t = 12。
在linux下,fpos_t是一个结构体,定义为:
- typedef struct
- {
- __off_t __pos; // 双下划线
- __mbstate_t __state;
- }fpos_t;
fpos_t.__pos才是指向当前位置的整数,可以进行赋值,如 fpos_t.__pos = 12。
【返回值】成功返回0,失败返回非0,并设置errno。
【实例】window上应用fgetpos函数取得当前文件的指针所指的位置。
- #include <string.h>
- #include <stdio.h>
- int main(void)
- {
- FILE *fp;
- char string[] = "This is a test";
- fpos_t pos;
- // 以读写方式打开一个名为test.txt的文件
- fp = fopen("test.txt", "w+");
- //\将字符串写入文件
- fwrite(string, strlen(string), 1, fp);
- // 取得指针位置并存入&pos所指向的对象
- fgetpos(fp, &pos);
- printf("The file pointer is at byte %ld\n", pos);
- // 重设文件指针的位置
- fseek(fp,3,0);
- // 再次取得指针位置并存入&pos所指向的对象
- fgetpos(fp, &pos);
- printf("The file pointer is at byte %ld\n", pos);
- fclose(fp);
- return 0;
- }
运行结果:
The file pointer is at byte 14
The file pointer is at byte 3
首先,程序以读写方式打开一个名为test.txt的文件,并把字符串"This is a test"写入文件。注意:字符串共14个字节,地址为0~13。用fwrite函数写入后,文件指针自动指向文件最后一个字节的下一个位置。即这时的fp的值应该是14。
再用fgetpos函数取得指针位置并存入&pos所指向的对象,此时, pos中的内容为14。然后在屏幕上显示出The file pointer is at byte 14。
再用fseek函数重设文件指针的位置,让fp的值为3,即指向文件中第4个字节。
再次取得指针位置并存入&pos所指向的对象。然后在屏幕上显示出The file pointer is at byte 3。
注意:在linux下,不能这样定义pos:
fpos_t * pos;
fgetpos(fp,pos);
必须这样定义:
fpos_t pos;
fgetpos(fp,&pos);
因为pos必须是一个分配好内存空间的参数。第一种方式仅仅是定义了一个指针,并没有分配空间。如果改为下面的定义方式,则可以编译通过:
fpos_t * pos;
pos = (fpos_t)malloc(12);
fgetpos(fp,pos);