• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言rewind和fseek函数的用法详解(随机读写文件)

C语言rewind和fseek函数的用法详解(随机读写文件)

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2022-04-30

匿名通过本文主要向大家介绍了等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
前面介绍的文件读写函数都是顺序读写,即读写文件只能从头开始,依次读写各个数据。但在实际开发中经常需要读写文件的中间部分,要解决这个问题,就得先移动文件内部的位置指针,再进行读写。这种读写方式称为随机读写,也就是说从文件的任意位置开始读写。

实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。

文件定位函数rewind和fseek

移动文件内部位置指针的函数主要有两个,即 rewind() 和 fseek()。

rewind() 用来将位置指针移动到文件开头,前面已经多次使用过,它的原型为:
void rewind ( FILE *fp );
fseek() 用来将位置指针移动到任意位置,它的原型为:
int fseek ( FILE *fp, long offset, int origin );
参数说明:
1) fp 为文件指针,也就是被移动的文件。

2) offset 为偏移量,也就是要移动的字节数。之所以为 long 类型,是希望移动的范围更大,能处理的文件更大。offset 为正时,向后移动;offset 为负时,向前移动。

3) origin 为起始位置,也就是从何处开始计算偏移量。C语言规定的起始位置有三种,分别为文件开头、当前位置和文件末尾,每个位置都用对应的常量来表示:
起始点常量名常量值文件开头SEEK_SET0当前位置SEEK_CUR1文件末尾SEEK_END2
 
例如,把位置指针移动到离文件开头100个字节处:
fseek(fp, 100, 0);
值得说明的是,fseek() 一般用于二进制文件,在文本文件中由于要进行转换,计算的位置有时会出错。

文件的随机读写

在移动位置指针之后,就可以用前面介绍的任何一种读写函数进行读写了。由于是二进制文件,因此常用 fread() 和 fwrite() 读写。

【示例】从键盘输入三组学生信息,保存到文件中,然后读取第二个学生的信息。
#include<stdio.h>#define N 3struct stu{    char name[10]; //姓名    int num;  //学号    int age;  //年龄    float score;  //成绩}boys[N], boy, *pboys;int main(){    FILE *fp;    int i;    pboys = boys;    if( (fp=fopen("d:\\demo.txt", "wb+")) == NULL ){        printf("Cannot open file, press any key to exit!\n");        getch();        exit(1);    }    printf("Input data:\n");    for(i=0; i<N; i++,pboys++){        scanf("%s %d %d %f", pboys->name, &pboys->num, &pboys->age, &pboys->score);    }    fwrite(boys, sizeof(struct stu), N, fp);  //写入三条学生信息    fseek(fp, sizeof(struct stu), SEEK_SET);  //移动位置指针    fread(&boy, sizeof(struct stu), 1, fp);  //读取一条学生信息    printf("%s  %d  %d %f\n", boy.name, boy.num, boy.age, boy.score);    fclose(fp);    return 0;}
运行结果:
Input data:
Tom 2 15 90.5↙
Hua 1 14 99↙
Zhao 10 16 95.5↙
Hua  1  14 99.000000
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-28C#复制和深度复制的实现方法
  • 2017-05-28c++如何分割字符串示例代码
  • 2017-05-28浅谈c++中的while(cin)问题
  • 2017-05-28Linux下g++编译与使用静态库和动态库的方法
  • 2017-05-28C语言 文件的打开与关闭详解及示例代码
  • 2017-05-28C++设计模式之享元模式
  • 2017-05-28C++类中的常数据成员与静态数据成员之间的区别
  • 2017-05-28结合C++11的新特性来解析C++中的枚举与联合
  • 2017-05-28C++之普通成员函数、虚函数以及纯虚函数的区别与用法要点
  • 2017-05-28浅谈c++调用python链接的问题及解决方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • c++中临时变量不能作为非const的引用参数的方法
    • C++编程中的函数指针初步解析
    • C++多线程编程简单实例
    • win32 api实现简单的消息窗口示例
    • C与C++ 无参函数的区别解析
    • 如何在程序中判断VS的版本(实现方法详解)
    • 深入学习C语言中memset()函数的用法
    • typedef_struct与struct之间的区别
    • 解析C/C++中如何终止线程的运行
    • C++实现遗传算法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有