第二十四讲 文件的定位

       关于文件的操作,我们说了不少了,虽然说得不深,但是一般的应用能够应付了,不过还有一点得说一下,那就是当我们打开一个文件,我们要什么地方读取信息呢?是要从一开始呢还是从当前位置还是从末尾添加呢?为了解决这个问题,我们今天来探讨一下文件的定位。
大家还记得我们怎么访问数组的吗?如果要是我们像访问数组内容一样的访问fopen打开的文件一样的话岂不是很方便呢?是啊,fseek这个函数就是现实这个功能的,我们可以通过fseek访问文件像访问数组一样的方便,那么fseek是怎么工作呢?我想既然已经提出这个问题,想必大家都一定很好奇了吧。
为了明白一个函数的用法,我们要先明白他的原型,下面是我们在MSDN上看到的原型:
—————————————-
int fseek(
FILE *stream,
long offset,
int origin
);

—————————————-
从这个原型里面,我们可以看到这个函数需要三个参数,第一个参数是FILE的指针,也就是我们打开文件fopen的返回指针。第二参数是偏移量,我们要想访问文件像访问数组一样简单就是靠这个参数。第三个参数就是读取模式,这个参数有三种类型:
—————————————–
SEEK_SET              文件开始
SEEK_CUR              当前位置
SEEK_END              文件结尾
——————————————-
第二个参数要起作用就是靠这第三个参数,第三个参数就是第二个参数偏移的原地,可以为负,可以为正,当为负的时候表示向后移,若为正表示向前移,下面我们来看下这个例子:
————————————–
#include <stdlib.h>#include <stdio.h>int main()
{
char ch,name;

FILE *file;

long count,last;

puts(“请输入要打开的文本文件:”);

gets(name);

file = fopen(name1,”r”);

if(file == NULL)
puts(“打开文件失败.”);

fseek(file,0L,SEEK_END);

last = ftell(file);

for(count=0L;

count<last;

count++)
{
fseek(file,-count,SEEK_END);

ch = getc(file);

if(ch != NULL);

putchar(ch)
}
system(“PAUSE”);

return 0;

}
——————————————
我们先准备一个txt文件,里面输入如下内容:
——————————————-
//lizi.txt
#include <stdlib.h>#include <stdio.h>int main()
{
char ch[20];

FILE *file;

file = fopen(“lizi.txt”,”r”);

if(file == NULL)
printf(“Open File fail.n”);

fgets(ch,20,file);

fputs(ch,stdout);

system(“PAUSE”);

return 0;

}
——————————————–
然后我们再来看下输出:
第二十四讲 文件的定位
程序反向输出,实现这一功能的就是靠fseek办到的,fseek将文件定位在文件尾部,所以从尾部一个个字符读取,所以打印出来的是从后到前打印出来。
大家要是注意的话里面出现了一个我们没有接触过的函数,就是ftell(),这个函数正是我们今天要说的,他是配合fseek一起使用的。所以还是老规矩,我们先看看这个函数的原型:
——————————
long ftell(
FILE *stream
);


—————————–
这个函数返回从文件开头到定位处的字符个数,是一个long类型。所以在我们得到这个long值后  ,我们就可以用一个for循环控制输出。
fseek和ftell这对函数有个极限性,那就是限定文件在long范围内,为了解决的这个问题,我们来看看另外一对函数:
————————————
int fgetpos (FILE * restrict stream, fpos_t * restrict pos);


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


————————————
这对函数里使用了一个叫做fpos_t的类型做参数,fpos_t不是什么基类型,而是通过其他类型定义的,关于fpos_t,有兴趣的同学可以去查一下,我就不多说,不过一般来说,fseek和ftell就足够了,试想2亿字符的文件有多大?所以,除非是超大文件,否则,fseek就足够了。
C语言部分说到这里,不知道算不算差不多了,如果有什么还想要知道的,大家可以提问,如果没什么问题,我想我们是不是可以开始尝试一下简单的windows编程呢?至于C++,我们打算在说完window编程再说。不过还是看大家的意见。

发表评论