文件指针与文件位置指针,位置指针相关操作库函数(zz)
(2016-02-23 14:29:24)http://blog.csdn.net/chenglibin1988/article/details/8750906
1 文件指针
文件指针是指向一个文件的指针,确切的将是指向用文件这个结构体所定义的对象的起始地址,文件指针的移动是指在文件之间来移动,
比如:
FILE * fp;
fp = fopen("/programe/test.txt","a+");
fp就表示文件指针。
问题:文件指针能不能在文件之间来回移动?
如果能的话,需要先释放文件指针吗?
如果不能的话,是为什么,是因为这个指针是指针常量吗?
解答:简单程序进行测试:
-
#include
<</span>stdio.h> -
#include
<</span>stdlib.h> -
-
int
main() -
{
-
-
FILE
* fp; -
fp
= fopen("/program/Demo.c","a+"); -
if(fp
== NULL) -
{
-
return -1; -
}
-
fprintf(fp,"hello
world:Demo.c"); -
fp
= fopen("/program/getcharDemo.c","a+"); -
if(fp
== NULL) -
{
-
return -1; -
}
-
-
fprintf(fp,"hello
world:getcharDemo.c"); -
fclose(fp);
一个指针先后指向两个不同的值,运行结果和程序预想的完全一致,在Demo.c和getcharDemo.c中的最后一行都分别输出了相应的值。
说明在这一点上面文件指针和普通的指针是一致的。
2 文件位置指针
文件位置指针是指文件打开之后,在文件内部进行移动的指针。
其数据类型是 fpos_t
在MSDN上面是这样说的:
fpos_t
copyright 1993-1999 by sunmicrosystem这样说:
typedef long fpos_t
typedef
typedef
经过32位linux平台上面编码测试发现它的大小是 12个字节。这个pos_t的结构里面应该至少有一个字段表示的是距离文件起始位置的偏移量。
C library reference中定义的文件位置指针的操作函数有以下这些:
1
stream, fpos_t
*
pos);
int fsetpos(FILE
*stream, const fpos_t
*
pos);
long int ftell(FILE
*
stream);
stream, long
int
offset,
int
);
2 在函数执行过程中移动文件位置指针:
size_t fread(void *
ptr,
size_t
size,
size_t
, FILE
*
stream);
size_t fwrite(const void *
ptr,
size_t
,
size_t
, FILE
*
stream);
3 long int ftell(FILE
*
stream);获取当前位置到文件开头的字符数
4 void rewind(FILE
*
stream);
5 int fgetc(FILE
*
stream);
int
fputc(int
, FILE
*
stream);
6 char *fgets(char
*
str,
int
n, FILE
*
stream);
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。