C语言fseek函数详解:“文件时光机”

C语言fseek函数详解:“文件时光机”一句话理解 fseek 在文件的 时间线 上自由穿梭 精准定位到任意字节位置 实现随机读写 函数原型 include

欢迎大家来到IT世界,在知识的湖畔探索吧!

⏳ 一句话理解 fseek

「在文件的‘时间线’上自由穿梭,精准定位到任意字节位置,实现随机读写!」


函数原型

#include 
  
    // 必须包含头文件 int fseek(FILE *stream, long offset, int whence); 
  

欢迎大家来到IT世界,在知识的湖畔探索吧!

入口参数

参数

类型

比喻解释

stream

FILE*

文件「时光机」的控制台(文件指针)

offset

long

时间跳跃的「步数」(字节偏移量)

whence

int

时间旅行的「起点」(定位基准)

定位基准(whence参数)

宏定义

比喻解释

SEEK_SET

0

从文件开头出发(时光起点)

SEEK_CUR

1

从当前位置出发(现在时刻)

SEEK_END

2

从文件末尾出发(未来终点)

返回参数

返回值

含义

0

时光穿梭成功

非0

穿梭失败(如超出文件范围)


核心功能图解

欢迎大家来到IT世界,在知识的湖畔探索吧!文件内容:A B C D E F G H I J 调用 fseek(file, 3, SEEK_SET) → 定位到第3字节(D) 调用 fseek(file, -2, SEEK_END) → 定位到倒数第2字节(I)

代码实例1:读取文件的特定片段

场景:直接读取文件的中间内容(类似快速翻书)

#include 
  
    int main() { FILE *file = fopen("story.txt", "rb"); // 二进制模式避免换行符干扰 if (!file) { perror(" 故事书打不开"); return 1; } // 时光穿梭:跳到第100字节处(跳过前言) if (fseek(file, 100, SEEK_SET) != 0) { printf("⏰ 穿梭失败,可能故事太短\n"); fclose(file); return 1; } char buffer[256]; size_t read = fread(buffer, 1, sizeof(buffer), file); if (read > 0) { printf("从第100字节开始的故事片段:\n%.*s\n", (int)read, buffer); } fclose(file); return 0; } 
  

⏪ 代码实例2:逆向读取文件

场景:从文件末尾逐字节向前读取

欢迎大家来到IT世界,在知识的湖畔探索吧!#include 
  
    int main() { FILE *file = fopen("message.txt", "rb"); if (!file) { perror(" 密文失窃"); return 1; } // 定位到文件末尾 fseek(file, 0, SEEK_END); long file_size = ftell(file); // 获取文件总大小 // 从后往前逐个字符读取 for (long i = 1; i <= file_size; i++) { fseek(file, -i, SEEK_END); // 时光倒流i步 char c = fgetc(file); putchar(c); } fclose(file); return 0; } 
  

技术细节剖析

1.偏移量的正负规则

基准点

正偏移量

负偏移量

SEEK_SET

向文件末尾移动

❌ 非法(可能崩溃)

SEEK_CUR

向前移动

向后移动

SEEK_END

❌ 通常非法

向前回溯

2.二进制模式 vs 文本模式

  • 在Windows系统中,文本模式的文件换行符会被转换,导致偏移量计算错误:
// 错误示范:文本模式下定位 FILE *file = fopen("data.txt", "r"); // 换行符会被转换 fseek(file, 10, SEEK_SET); // 实际位置可能不准确

3.与 ftell 的黄金组合

欢迎大家来到IT世界,在知识的湖畔探索吧!// 记录当前位置 long pos = ftell(file); // ...其他操作后 fseek(file, pos, SEEK_SET); // 回到记录的位置

⚠️ 致命误区

1.定位到无效位置

FILE *file = fopen("empty.txt", "r"); fseek(file, 100, SEEK_SET); // 文件为空,定位失败!

2.忘记刷新缓冲区

欢迎大家来到IT世界,在知识的湖畔探索吧!fprintf(file, "Hello"); fseek(file, 0, SEEK_SET); // 写操作后直接定位,缓冲区可能未刷新

️ 高级技巧:快速获取文件大小

FILE *file = fopen("bigfile.bin", "rb"); fseek(file, 0, SEEK_END); // 时光机飞到终点 long size = ftell(file); // 记录终点位置 printf("文件大小:%ld 字节\n", size); fseek(file, 0, SEEK_SET); // 回到起点

对比 rewind

操作

功能

是否重置错误标志

fseek(file, 0, SEEK_SET)

回到文件起点

rewind(file)

回到文件起点 + 清除错误标志


总结

  • 核心功能:精确定位文件指针位置
  • 必用场景:数据库索引、文件格式解析、日志回查
  • 类比记忆:就像DVD播放器的快进/快退按钮,fseek 是操作文件的「时光遥控器」

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/116252.html

(0)
上一篇 51分钟前
下一篇 41分钟前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信