C语言文件操作(三) —— 文件的随机读写(fseek)
创始人
2024-04-01 15:50:41
0

        目录

1、什么是文件的随机读写

2、认识文件随机读写函数

(1) fseek 函数 —— 移动文件指针的位置

(2) ftell 函数 —— 告知当前文件指针相对于起始位置的偏移量

(3) rewind —— 让文件指针重新回到起始位置


1、什么是文件的随机读写

我们使用fopen打开一个文件可以得到一个文件指针,这个文件指针也会被用于读写文件的时候。我们在读取一个文件的时候,文件指针指向下一个我们要读取的字符(一开始指向第一个字符),每当我们调用一次读取函数时,如 fgetc/fgets,这个文件指针就会向后移动一个或者多个单位。

文件的随机读写,其实就是我们可以指定这个文件指针指向的位置,即指向第几个字符,然后从这个字符开始读写。

2、认识文件随机读写函数

(1) fseek 函数 —— 移动文件指针的位置

fseek 函数的作用是,给定起始位置和偏移量,移动文件指针到指定位置。函数声明如下:

第一个参数:文件指针

第二个参数:相对于起始位置的偏移量。

  • offset < 0,从起始位置起,向左移动 | offset | 个单位
  • offset > 0,从起始位置起,向右移动 | offset | 个单位

第三个参数:起始位置。可选值有三个

可选值解析

SEEK_CUR

当前文件指针指向的位置

SEEK_END

文件末尾

SEEK_SET

文件起始位置

返回值:成功返回0,失败返回一个非零值。

FILE* pf = fopen("D:\\data.txt", "r");
if (pf == NULL)
{perror("fopen");return -1;
}int ch1 = fgetc(pf);
printf("%c\n", ch1);        // afseek(pf, -1, SEEK_CUR);    // 将文件指针相对于当前位置向左移动一个单位
int ch2 = fgetc(pf);
printf("%c\n", ch2);        // afclose(pf);
pf = NULL;

一开始文件指针指向起始位置

第一次调用 fgetc ,文件指针向后移动一个单位,指向了字符 'b'

调用 fseek,将文件指针相对于当前位置向左移动一个单位,此时文件指针又重新指向字符 'a'

此时再次调用 fgetc 获取到的字符就是 'a',所以打印结果为

 

(2) ftell 函数 —— 告知当前文件指针相对于起始位置的偏移量

ftell 函数可以返回当前文件指针相对于起始位置的偏移量,这里说的起始位置,默认指的是文件开始的位置。函数声明如下:

第一个参数:文件指针

返回值:成功返回一个偏移量;失败返回-1L,同时errno会被设置

FILE* pf = fopen("D:\\data.txt", "r");
if (pf == NULL)
{perror("fopen");return -1;
}fgetc(pf);
fgetc(pf);long pos = ftell(pf);
printf("%d\n", pos);fclose(pf);
pf = NULL;

(3) rewind —— 让文件指针重新回到起始位置

rewind 函数可以让文件指针回到 文件开始的位置。函数声明如下:

第一个参数:文件指针

FILE* pf = fopen("D:\\data.txt", "r");
if (pf == NULL)
{perror("fopen");return -1;
}fgetc(pf);
fgetc(pf);long pos = ftell(pf);
printf("重置之前文件指针的位置: %d\n", pos);rewind(pf);
pos = ftell(pf);
printf("重置之后文件指针的位置: %d\n", pos);fclose(pf);
pf = NULL;

上一篇:牛客训练3

下一篇:【Linux学习】基础IO

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...