关于文件的操作,我们说了不少了,虽然说得不深,但是一般的应用能够应付了,不过还有一点得说一下,那就是当我们打开一个文件,我们要什么地方读取信息呢?是要从一开始呢还是从当前位置还是从末尾添加呢?为了解决这个问题,我们今天来探讨一下文件的定位。
大家还记得我们怎么访问数组的吗?如果要是我们像访问数组内容一样的访问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编程再说。
====================
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。