首页 > 其他分享 >C语言:随机访问fseek()和ftell()

C语言:随机访问fseek()和ftell()

时间:2022-09-05 16:01:16浏览次数:48  
标签:fp 文件 fseek fpos C语言 ftell SEEK

随机访问fseek()和ftell()

有了fseek()函数,便可把文件看作是数组,在fopen()打开的文件中直接移动到任意字节处。

下面代码演示了fseek()ftell()的用法:

#include <stdio.h>
#include <stdlib.h>
#define CNTL_Z '\032'        /* DOS文本文件中的文件结尾标记 */
#define SLEN 81
int main(void) {
    char ch;
    FILE *fp;
    long count, last;

    char file[] = "C:\\Users\\MSI-\\Desktop\\test.txt";

    if ((fp = fopen(file, "rb")) == NULL)
    {                                    /* 只读模式    */
        printf("reverse can't open %s\n", file);
        exit(EXIT_FAILURE);
    }

    fseek(fp, 0L, SEEK_END);                /* 定位到文件末尾 */
    last = ftell(fp);                     //返回字节数
    for (count = 1L; count <= last; count++)
    {
        fseek(fp, -count, SEEK_END);        /* 回退        */
        ch = getc(fp);
        if (ch != CNTL_Z && ch != '\r')    /* MS-DOS 文件 */
            putchar(ch);
    }
    putchar('\n');
    fclose(fp);

    return 0;
}

文件内容和输出:

image-20220905095133383

该程序使用二进制模式,以便处理MS-DOS文本和UNIX文件。但是,在使用其他格式文本文件的环境中可能无法正常工作。

fseek()和ftell()的工作原理

fseek

fseek()的第一个参数是FILE指针,指向待查找的文件。

fseek()的第二个参数是偏移量,该参数表示从起点开始要移动的距离。该参数必须是一个long类型的值,可以为正(前移)、负(后移)、0(保持不动)。

fseek()的第三个参数是模式,该参数确定起始点(参见下表列出的起始点模式)。根据ANSI标准,在stdio.h头文件中规定了几个表示模式的明示常量:

模式 偏移量的起始点 数值
SEEK_SET 文件开始出 0L
SEEK_CUR 当前位置 1L
SEEK_END 文件末尾 2L

下面是调用fseek函数的例子:

fseek(fp, 0L, SEEK_SET);     // 定位至文件开始处
fseek(fp, 10L, SEEK_SET);    // 定位至文件中的第10个字节
fseek(fp, 2L, SEEK_CUR);     // 从文件当前位置前移2个字节
fseek(fp, 0L, SEEK_END);     // 定位至文件结尾
fseek(fp, -10L, SEEK_END);   // 从文件结尾处回退10个字节

如果一切正常,fseek()返回值为0,如果出现错误(如试图移动的距离超过文件的范围),其返回值为-1。

ftell

ftell()函数返回类型是long,它返回的是参数指向文件的当前位置距文件开始处的字节数。ANSI C把它定义在stdio.h中。在最初实现的UNIX中,ftell()通过返回距文件开始处的字节数来确定文件的位置。文件的第1个字节到文件开始处的距离是0,以此类推。ANSI C规定,该定义适用于以二进制模式打开的文件,以文本模式打开文件的情况不同。

把当前位置设置为距文件末尾0字节偏移量。也就是说,该语句把当前位置设置在文件结尾。

fseek(fp, 0L, SEEK_END);

把从文件开始处到文件结尾的字节数赋给last。

last = ftell(fp);

fgetpos()和fsetpos()函数

fseek()ftell()潜在的问题是,他们都把文件大小都限制在long类型能表示的范围内。

鉴于此,ANSI C新增了两个处理较大文件的新定位函数:

fgetpos()fsetpos()。这两个函数不使用long类型的值表示位置,它们使用一种新类型:fpos_t(代表file position type,文件定位类型)。

fpos_t类型不是基本类型,它根据其他类型来定义。

fpos_t类型的变量或数据对象可以在文件中指定一个位置,它不能是数组类型,除此之外,没有其他限制。实现可以提供一个满足特殊平台要求的类型,例如,fpos_t可以实现为结构体。

ANSI C定义了如何使用fpos_t类型。fgetpos()函数的原型如下:

int fgetpos(FILE * restrict stream, fpos_t * restrict pos);

调用该函数时,它把fpos_t类型的值放在pos指向的位置上,该值描述了文件中的当前位置距文件开头的字节数。如果成功,fgetpos()函数返回0;如果失败,返回非0。

fsetpos()函数的原型如下:

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

调用该函数时,使用pos指向位置上的fpos_t类型值来设置文件指针指向偏移该值后指定的位置。如果成功,fsetpos()函数返回0;如果失败,则返回非0。fpos_t类型的值应通过之前调用fgetpos()获得。

标签:fp,文件,fseek,fpos,C语言,ftell,SEEK
From: https://www.cnblogs.com/wwjj4811/p/16658474.html

相关文章

  • (鹏哥C语言)C语言学习记录1
    作用域:局部变量的作用域:就是局部变量所在的局部范围全局变量的作用域:整个工程。(不同文件之间需要声明一下变量)执行性代码必须放进大括号里。生命周期:变量的生命周期:变......
  • C语言:文件IO fprint()、fscanf()、fgets()、fputs()
    fprintf()和fscanf()函数文件I/O函数fprintf()和fscanf()函数的工作方式与printf()和scanf()类似,区别在于前者需要用第1个参数指定待处理的文件。下面演示了fprintf()和f......
  • 《跟着星仔学C语言》简介
    [前言]  本人男,外号星仔,80后,国内重点大学毕业,对技术有执著的追求.一生碌碌,未成大气候,唯一欣慰的是技术方面不曾落后,看上去还挺牛X.  学习C/C++需要耐心......
  • [数据结构10分钟入门] 面向初学者从零实现(基于C语言)-- 单链表
    ​一、链表是什么    链表是一种通过指针串联在一起的线性结构,在内存中是分散存储的(数组在内存中连续分布),链表由一系列节点组成,每个节点都由数据域和指针域组成。主......
  • C语言字符串处理函数 puts()和fputs()的区别及使用
    ​字符串函数(Stringprocessingfunction)也叫字符串处理函数,指的是编程语言中用来进行字符串处理的函数。本文主要介绍C语言中符串处理函数puts()和fputs()的区别使用方......
  • 0:打开C语言大门
    C语言教程C语言教程开端详见:菜鸟教程简单介绍:走个过场C语言是一种通用的、面向过程式的计算机程序设计语言。1972年,为了移植与开发UNIX操作系统,丹尼斯·里......
  • C语言int类型在16位和32位单片机所占的字节数
    16位系统int类型长度为2字节32位系统int类型长度为4字节例如:在16位系统中,存储端口号需要用uint类型(unsignedint),范围0~65535,打印输出时可用"%u"或“%lu”。32系统使用......
  • C语言大纲
    网络方向:技能模块5.C语言程序设计1.技术要求(1)能够实现顺序结构的程序设计。(2)能利用if语句、switch语句实现分支结构的程序设计。8(3)能利用while循环,do...while循环和for循环......
  • C语言拍品管理系统
    C语言拍品管理系统拍品管理系统一、课题内容:通过建立拍品管理系统,实现对拍品相关信息的录入、查询、删除、修改,对于新拍品的信息可以自己更改添加备注,对于拍品库内的拍......
  • C语言源程序解析程序
    C语言源程序解析程序一、 课程设计的基本要求根据所学知识,编写指定题目的C++语言程序,并规范地完成课程设计报告。通过课程设计,加深对《C++面向对象程序设计》课程所学知......