首页 百科知识 文件的定位_C语言入门

文件的定位_C语言入门

时间:2021-09-15 百科知识 联系我们

文件的定位_C语言入门

关于文件的操作,我们说了不少了,虽然说得不深,但是一般的应用能够应付了,不过还有一点得说一下,那就是当我们打开一个文件,我们要什么地方读取信息呢?是要从一开始呢还是从当前位置还是从末尾添加呢?为了解决这个问题,我们今天来探讨一下文件的定位。

       大家还记得我们怎么访问数组的吗?如果要是我们像访问数组内容一样的访问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(www.guayunfan.com)

#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编程再说。

====================