加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

文件指针与文件位置指针,位置指针相关操作库函数(zz)

(2016-02-23 14:29:24)
分类: 编程语言C/C /PERL/Tcl

http://blog.csdn.net/chenglibin1988/article/details/8750906

1 文件指针

文件指针是指向一个文件的指针,确切的将是指向用文件这个结构体所定义的对象的起始地址,文件指针的移动是指在文件之间来移动,

比如:

FILE * fp;

fp = fopen("/programe/test.txt","a+");

fp就表示文件指针。

问题:文件指针能不能在文件之间来回移动?

如果能的话,需要先释放文件指针吗?

如果不能的话,是为什么,是因为这个指针是指针常量吗?

解答:简单程序进行测试:

 

[html] view plain copy
  1. #include <</span>stdio.h>  
  2. #include <</span>stdlib.h>  
  3.   
  4. int main()  
  5.  
  6.   
  7. FILE fp;  
  8. fp fopen("/program/Demo.c","a+");  
  9. if(fp == NULL)  
  10.  
  11.         return -1;  
  12.  
  13. fprintf(fp,"hello world:Demo.c");  
  14. fp fopen("/program/getcharDemo.c","a+");  
  15. if(fp == NULL)  
  16.  
  17.         return -1;  
  18.  
  19.   
  20. fprintf(fp,"hello world:getcharDemo.c");  
  21. fclose(fp);  

一个指针先后指向两个不同的值,运行结果和程序预想的完全一致,在Demo.c和getcharDemo.c中的最后一行都分别输出了相应的值。

 

说明在这一点上面文件指针和普通的指针是一致的。

2 文件位置指针

文件位置指针是指文件打开之后,在文件内部进行移动的指针。

其数据类型是 fpos_t

在MSDN上面是这样说的:

fpos_t (long integer, __int64, or structure, depending on the target platform)依据平台架构可能是long型也可能是struct型

copyright 1993-1999 by sunmicrosystem这样说:

typedef long fpos_t

typedef    long long   __longlong_t;
typedef    __longlong_t  fpos_t

经过32位linux平台上面编码测试发现它的大小是 12个字节。这个pos_t的结构里面应该至少有一个字段表示的是距离文件起始位置的偏移量。


C library reference中定义的文件位置指针的操作函数有以下这些:

获取文件位置指针当前的位置。 

  int fgetpos(FILE *stream, fpos_t *pos);

  int fsetpos(FILE *stream, const fpos_t *pos);

   移动文件位置指针:

  long int ftell(FILE *stream);

 int fseek(FILE *stream, long int offset, int whence);

2 在函数执行过程中移动文件位置指针:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);


long int ftell(FILE *stream);获取当前位置到文件开头的字符数

void rewind(FILE *stream); 文件位置指针返回到文件开头

int fgetc(FILE *stream);

  int fputc(int char, FILE *stream);

char *fgets(char *str, int n, FILE *stream);

  int fputs(const char *str, FILE *stream);

fgets和fputs系列函数也在读完当前行之后,会把文件位置指针指向下一行的开始处。


http://blog.csdn.net/cy_cai/article/details/11457133

程序:

#include

int main(int argc,char *argv[])

{

FILE stream;

fpos_t pos;


stream = fopen(“/etc/passwd”,”r”);

fseek(stream,5,SEEK_SET);

printf(“offset=%d/n”,ftell(stream));


rewind(stream);

 

fgetpos(stream,&pos);

printf(“offset=%d/n”,pos);


pos = 10;

fsetpos(stream,&pos);

printf(“offset %d/n”,ftell(stream));


fclose(stream);

return 0;

}


结果:

offset 5

offset = 0

offset = 10



fseek移动文件流读写位置

头文件

#include

定义函数

int fseek(FILE stream,long offset,int whence);

函数说明

fseek()用来移动文件流的读写位置。参数stream为已打开的文件指针,参数offset为根据参数whence来移动读写位置的位移数。

参数 whence为下列其中一种:

SEEK_SET--文件开头offset位移量 为 新的读写位置。

SEEK_CUR--目前的读写位置往后增加offset个位移量

SEEK_END--指向文件尾再增加offset个位移量 为 新的读写位置。


当whence值为SEEK_CUR 或SEEK_END时,参数offset允许负值的出现。

下列是较特别的使用方式:

1) 欲将读写位置移动到文件开头时:fseek(FILE *stream,0,SEEK_SET);

2) 欲将读写位置移动到文件尾时:fseek(FILE *stream,0,0SEEK_END);


返回值

当调用成功时则返回0,若有错误则返回-1,errno会存放错误代码。

附加 

fseek()不像lseek()会返回读写位置,因此必须使用ftell()来取得目前读写的位置。


ftell取得文件流读取位置) 

头文件 

#include

定义函数 

long ftell(FILE stream);

函数说明 

ftell()用来取得文件流目前的读写位置。参数stream为已打开的文件指针。

返回值 

当调用成功时则返回目前的读写位置,若有错误则返回-1,errno会存放错误代码。

错误代码 EBADF 参数stream无效或可移动读写位置的文件流。


rewind重设文件流读写位置文件开头) 

头文件

#include

定义函数 

void rewind(FILE stream);

函数说明 

rewind()用来把文件流的读写位置移至文件开头。参数stream为已打开的文件指针。此函数相当于调用fseek(stream,0,SEEK_SET)。

返回值 

无返回值 


fgetpos取得当前文件指针所指位置

头文件

#include

函数原型

int fgetpos( FILE *stream, fpos_t *pos );

函数功能

取得当前文件的指针所指的位置,并把该指针所指的位置数存放到pos所指的对象中。pos值以内部格式存储,仅由fgetpos和fsetpos使用。其中fsetpos的功能与fgetpos相反,为了详细介绍,将在后节给与说明。

返回值

成功返回0,失败返回非0,并设置errno。


fsetpos(文件指针定位pos指定位置上)

 

 

头文件

 

 

#include

 

函数原型

 

int fsetpos(FILE *fp, const fpos_t *pos);

 

函数功能

 

 

将文件指针定位在pos指定的位置上。该函数的功能与前面提到的fgetpos相反,是将文件指针fp按照pos指定的位置在文件中定位。pos值以内部格式存储,仅由fgetpos和fsetpos使用。

 

 

返回值

 

 

 

成功返回0,否则返回非0。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有