ftell等重定位流相关函数

版权声明:本文为博主原创文章,转载请附原文链接 https://blog.csdn.net/zujipi8736/article/details/86606204

说明:本文主要是对man 帮助命令的翻译,若有错误,欢迎指正

fengjingtu

在上一篇博客中我们介绍了fseek函数,fseek函数可以将一个打开的文件的指示符重新定位到你想定位的位置。使用SEEK_SET,SEEK_CUR,SEEK_END,作为相对位置,相距n个字节,n是long型。本片文章,继续讲述与fseek相关的其他几个函数:ftell,rewind,fgetpos,fsetpos。


ftell

定义

#include <stdio.h>

long ftell(FILE *stream);

说明

ftell() 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。(2.1G以上的文件操作时可能出错。)


调用失败时返回-1,如果stream=NULL会引发程序中断。

我们可以使用ftell获得文件的大小。

示例

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
    int rtn=-1;
    long pos=0;
    FILE * fp=NULL;

//    pos=ftell(fp); //程序会中断

    fp = fopen("test.txt", "r+");
    if(fp == NULL)
    {
        printf("file unreable\n");
        return -1;
    }
    else
    {
        fseek(fp,3L, SEEK_SET);//重定位到文件开头后3个字节处,验证ftell功能
        pos=ftell(fp);
        printf("pos=%ld\n",pos);

        rtn=fseek(fp,0, SEEK_END);//重定位到文件末尾,查看文件字节数。
        pos=ftell(fp);
        printf("pos=%ld\n",pos);

        fclose(fp);
        return 0;
    }
}

运行结果:
pos=3
pos=1848

在windows中查看test.txt的文件属性,发现大小也是1848字节。

test.txt

rewind

定义

#include <stdio.h>

void rewind(FILE *stream);

说明

rewind()函数用于将文件指针重新指向文件的开头,同时清除和文件流相关的错误和标记

相当于调用fseek(stream, 0, SEEK_SET)


示例

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
    int rtn=-1;
    long pos=0;
    FILE * fp=NULL;

    fp = fopen("test.txt", "r+");
    if(fp == NULL)
    {
        printf("file unreable\n");
        return -1;
    }
    else
    {
        fseek(fp,3L, SEEK_SET);//重定位到文件开头后3个字节处
        pos=ftell(fp);
        printf("pos=%ld\n",pos);
        rewind(fp);//重定位到文件开头
        pos=ftell(fp);
        printf("pos=%ld\n",pos);

        fclose(fp);
        return 0;
    }
}

运行结果:
pos=3
pos=0

fgetpos 和 fsetpos

定义

#include <stdio.h>
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fpos_t *pos);

说明

fgetpos()函数和 ftell()类似,他只是把返回的指示符位置保存到 pos 中。
fsetpos函数功能上和fseek类似,根据 * pos中的值设置当前文件位置,它必须是前面在同一个流上的调用fgetpos所返回的一个值。

如果调用成功,这个函数返回0。
如果遇到了错误,它返回一个非零值,并在errno中存储一个因编译器而异的正值。

getpos和fsetpos函数是标准C新增的。
增加他们的目的是为了处理那些因为过于庞大而无法由long int类型的整数来定位的文件,在一些非UNIX系统中,一个 fpos_t 对象可能是一个复杂的对象。

示例

test.txt的内容:

123
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
    FILE * fp=NULL;
    fpos_t pos;
    fpos_t pos2;

    fp = fopen("test.txt", "r+");
    if(fp == NULL)
    {
        printf("file unreable\n");
        return -1;
    }
    else
    {
        fgetpos(fp,&pos);//刚开始指示符在文件开头,pos定位在文件开头
        printf("%c\n",fgetc(fp));//fgetc是指示符移动一个字节
        fgetpos(fp,&pos2);//pos2定位在文件第一个字节处
        fsetpos(fp,&pos);//把指示符定位到pos指向的位置:文件开头。
        printf("%c\n",fgetc(fp));
        fsetpos(fp,&pos2);//把指示符定位到pos2指向的位置:文件第一个字节处。
        printf("%c\n",fgetc(fp));
        fclose(fp);
        return 0;
    }
}


运行结果:
1
1
2

关于ftell,rewind,fgetpos,fsetpos你了解了吗,自己验证一下吧_

猜你喜欢

转载自blog.csdn.net/zujipi8736/article/details/86606204