我们现在要做这样一件事:
fp=fopen();
打开一个文件
fputc(fp) 10;
每次写进一个字符,写10次,就往文件中写了10个字符
fgetc() 10;
想要读出写进去的字符,那么就读10次
上面的逻辑是错误的,因为文件当中有一个文件位置指针,写的时候是依次向后移动,读的时候也是,像是一个游标。
读和写一定是从当前位置开始的,上面伪码在写完以后,位置指针最终指向的是第十个位置,然后读的时候,就会从第十一个位置开始。读的内容不知道。
有一个很笨拙地方法:
fp=fopen();
fputc(fp) 10;
fclose(fp);//先关闭
fopen(fp);//然后再一次打开,这个时候文件指针就在文件开始处
fgetc() 10;
以上伪代码可以实现,但是这种方法不实际
fseek();ftell();rewind():
------------------ reposition a stream(重新定位一个文件流)
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);//返回值:如果成功返回0,出错返回非0值
中间的参数是一个偏移量的大小。
第三个参数是一个位置量(从什么位置开始)
long ftell(FILE *stream);//返回值:若成功,就返回当前文件位置指示,出错就返回-1L,反映出文件位置指针当前位置是哪里
void rewind(FILE *stream);//相当于:(void) fseek(stream, 0L, SEEK_SET) 功能:将文件指针指在文件的开始处。
SEEK_SET:表示从文件的起始位置开始
SEEK_CUR:表示从文件的当前位置开始
SEEK_END:表示从文件的尾端开始
伪代码可以写成这样:
fp=fopen();
fputc(fp) 10;
想要从文件首开始,可以使用下面的函数
fseek(fp,0,SEEK_SET);
fgetc() 10;
小例子:
函数功能:利用fseek和ftell来计算文件的长度
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
FILE *fp;
int count=0;
if(argc<2)
{
fprintf(stderr,"Usage.....\n");
exit(1);
}
fp=fopen(argv[1],"r");
if(fp