Loading... > ➢前面介绍的对文件的读写方式都是顺序读写,即读写文件只能从头开始,顺序读写各个数据 > > ➢但在实际问题中常要求只读写文件中某一指定 的部分 > > 例如:读取文件第200字节处的30个字节 > ➢为了解决这个问题可以移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写 > > ➢实现随机读写的关键是要按要求移动位置指针,这称为文件的定位. > > ➢完成文件定位的函数有: > > rewind、ftell、 fseek 函数 --- ## rewind函数 void rewind(文件指针); 函数功能:把文件内部的位置指针移到文件首 函数形式:rewind(文件指针); 例如: ```C fwrite(pa,sizeof(struct stu),2,fp); rewind(fp); fread(pd,sizeof(struct stu),2,fp); ``` * 接着上一篇文章 <div class="preview"> <div class="post-inser post box-shadow-wrap-normal"> <a href="https://blog.fivk.cn/archives/206.html" target="_blank" class="post_inser_a no-external-link no-underline-link"> <div class="inner-image bg" style="background-image: url(https://blog.fivk.cn/usr/uploads/2021/02/278231536.png);background-size: cover;"></div> <div class="inner-content" > <p class="inser-title">【C】文件_随机读写(知识点的引入)</p> <div class="inster-summary text-muted"> 我们开始学文件读写时可能会遇到一些问题。我们来看一看这个代码#include<stdio.h> int... </div> </div> </a> <!-- .inner-content #####--> </div> <!-- .post-inser ####--> </div> * 我们可以利用rewind函数简化代码 ```C #include<stdio.h> int main(int argc, char* argv[]) { char buf[128] = ""; FILE* fp = NULL; fp = fopen("e.txt", "w+"); if (fp == NULL) { perror("fopen"); return 0; } //先往、文件中写入一个字符串"hello Fivk" fputs("hello Fivk", fp); //复位文件流指针 rewind(fp); //在从文件中读取 该字符串 fgets(buf, sizeof(buf), fp); printf("buf = %s", buf); fclose(fp); return 0; } ``` * 得到同样的结果![image.png](https://blog.fivk.cn/usr/uploads/2021/02/2329785519.png) --- ## ftell函数 定义函数:long ftell(文件指针); 函数功能:取得文件流目前的读写位置 返回值: * 返回成功:返回当前位置(距离文件起始的字节数,是返回数值) * 返回失败:返回 -1 例如: ```C long length length = ftell(fp); ``` ```C #include<stdio.h> int main(int argc, char* argv[]) { long length; FILE* fp = fopen("e.txt", "w+"); if (NULL==fp) { perror("fopen"); return 0; } //先往文件中写入 一个字符串 "hello Fivk" fputs("hello Fivk", fp); //获取 文件流指针 距离 文件首部的 字节数 length = ftell(fp); printf("%ld", length); fclose(fp); return 0; } ``` * 输出结果![输出10](https://blog.fivk.cn/usr/uploads/2021/02/1061133595.png) --- ## fseek函数(一般用于二进制文件) 定义函数:int fseek(文件类型指针,位移量,起始点); 函数功能:移动文件流读写位置 说明: | 起始点 | 宏 | 值 | | - | - | - | | 文件开头 | SEEK_SET | 0 | | 文件当前位置 | SEEK_CUR | 1 | | 文件末尾 | SEEK_END | 2 | 位移量:以起点为基点,向 前、后 移动的字节数。 位移量可正可负: * -10:往左边移动10字节 * 10:往右边移动10字节 例如: * 练习:将一个未知大小的文件(文本文件)全部读入内存,并显示在屏幕上 * 参考:fseek、ftell、rewind、fread、malloc ```C #include<stdio.h> int main(int argc, char* argv[]) { char* date = NULL; long len = 0; FILE* fp = fopen("f.txt", "r"); if (NULL == fp) { perror("fopen"); return 0; } //需求:一次性的将文件数据 读取到内存中 //一、得到文件总大小 //1.使用fsesk 将文件指针 定位到文件尾部 fseek(fp, 0, 2); //2.使用ftell 计算文件的偏移量 == 文件的总大小 len = ftell(fp); //3.复位文件流指针 rewind(fp); //二、根据文件总大小 合理 申请 内存空间 date = (char*)calloc(1, len + 1); //+ 1的目的 内存末尾存放'\0' if (NULL == date) { fclose(fp); perror("calloc"); return 0; } //三、一次性将文件按数据 读入到 内存空间 fread(date, len, 1, fp); //四、遍历读取到的内容 printf("%s\n", date); //五、释放堆区空间 if (NULL == date) { free(date); date = NULL; } //关闭文件 fclose(fp); return 0; } ``` * 运行结果 ![](https://blog.fivk.cn/usr/uploads/2021/02/2264602016.png) --- 最后修改:2021 年 02 月 21 日 © 禁止转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏