返回信息流每个被使用的文件都在内存中开辟一个区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置)。这些信息是保存在一个结构体变量中的。该结构体类型是系统定义的,取名为FILE。Turbo C在stdio.h文件中有以下的文件类型声明:
typedef struct
{
short level; /*缓冲区“满”或“空”的程度*/
unsigned flags; /*文件状态标志*/
char fd; /*文件描述符*/
unsigned char hold; /*如无缓冲区不读取字符*/
short bsize; /*缓冲区的大小*/
unsigned char *buffer; /*数据缓冲区的位置*/
unsigned ar *curp; /*指针,当前的指向*/
unsigned istemp; /*临时文件,指示器*/
short token; /*用于有效性检查*/
}FILE;
rewind函数的作用是使位置指针从新返回文件的开头
FILE *fp1,*fp2;
fp1=fopen(“file1.c”,”r”);
fp2=fopen(“file2.c”,”w”);
while(!feof(fp1)) putchar(getc(fp1));
rewind(fp1);
while(!feof(fp1)) putc(getc(fp1),fp2);
fp1和fp2是指向FILE类型的指针,并不是指向文件中具体内容的指针,怎么可能直接对fp1和fp2自增指向下一个字节或者置0指向文件开头。按我的理解fp自增的话应该是指向下一个结构体FILE,FILE只是存放文件的基本信息,而不是具体内容。
求大牛指点迷津,想了很久也想不通。
这是一条镜像帖。来源:北邮人论坛 / cpp / #42618同步于 2010/8/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
文件类型指针
kzdg2005
2010/8/23镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
每一个file打开以后,都含有一个指针,用来标识当前的字符。
这个指针非 FILE *
指向下一字节和置0说的就是这个指针。
没有见过fp自加自减的。
FILE *fp1;
fp1=fopen("file1.c","r");
rewind(fp1);这个函数作用就是使指针fp置为0重新返回文件的开头,但是fp是FILE类型的(FILE *fp),不是位置指针吧?
还有fseek函数,可以将位置指针按需要移动到任意位置:
FILE *fp1;
fp1=fopen("file1.c","r");
fseek(fp,sizeof(struct student_type),0);这是使指针fp移到离文件头sizeof(struct student_type)字节处,但是fp也是FILE类型的,也不是位置指针?
所以相当疑惑。
【 在 ericyosho 的大作中提到: 】
: 每一个file打开以后,都含有一个指针,用来标识当前的字符。
: 这个指针非 FILE *
: 指向下一字节和置0说的就是这个指针。
: ...................
这方面我一下子不能解释的特别准确,不过我建议LZ看一下《UNIX环境高级编程》(简称APUE)相关章节,还有fopen、fseek等这些相关函数的源代码,会有更好的理解。
【 在 kzdg2005 的大作中提到: 】
: FILE *fp1;
: fp1=fopen("file1.c","r");
: rewind(fp1);这个函数作用就是使指针fp置为0重新返回文件的开头,但是fp是FILE类型的(FILE *fp),不是位置指针吧?
: ...................
楼主描述的好高深=。=
fp指针是指向FILE结构的,额,FILE,大致上你也可以这样理解,是文件描述符和缓冲区的封装=。=
fp指针是不可能增减的
楼主所谓的增减,其实是,打开文件表(操作系统维护的一个表结构),打开文件表中会记录一个文件位置的数据(貌似是长整型,哪看到的忘了。。。不过具体的系统可能不同吧),所谓的增减,是增减这个打开文件表中的 文件位置 这个数据,嗯。
说的更具体一点:
FILE *fp = fopen("test.txt", "r");
rewind(fp);
的意思,修改的是你上面给出的结构里面 curp 这个东西
这个解释比较能够理解。不过最好先去查查rewind和fopen的函数实现,看是否真的是针对curp指针
【 在 ericyosho 的大作中提到: 】
: 说的更具体一点:
: FILE *fp = fopen("test.txt", "r");
: rewind(fp);
: ...................