`

文件流读写函数

阅读更多
    一旦打开了流,则可在 3 种不同类型的非格式化 I/O 中进行选择,对其进行读、写操作。
    (1) 每次一个字符的 I/O。如果流是带缓冲的,则标准 I/O 函数处理所有缓冲。
    (2) 每次一行的 I/O。
    (3) 直接 I/O,有时也被称为二进制 I/O。fread 和 fwrite 函数支持这种类型的 I/O。每次 I/O 操作读或写某种数量的对象,而每个对象具有指定的长度。这两个函数通常用于从二进制文件中每次读或写一个结构。
    以下 3 个函数可用于一次读一个字符。
#include <stdio.h>
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void);
     /* 返回值:若成功,都返回下一个字符;若已到达文件尾端或出错,则都返回 EOF */

    函数 getchar 等同于 getc(stdin)。前两个函数的区别是:getc 可被实现为宏,而 fgetc 不能。这就意味着以下几点。
    1、getc 的参数不应当是具有副作用的表达式,以免被计算多次。
    2、因为 fgetc 一定是一个函数,所以可以得到其地址。因此允许将 fgetc 的地址作为另一个函数的参数。
    为了区分是出错还是到达尾端,必须调用 ferror 或 feof。
#include <stdio.h>

int ferror(FILE *fp);
int feof(FILE *fp);
           /* 返回值:若条件为真,都返回非 0;否则,都返回 0 */
void clearerr(FILE *fp);

    在大多数实现中,每个流在 FILE 对象中都维护了两个标志:出错标志和文件结束标志。调用 clearerr 可以清除这两个标志。
    从流中读取数据以后,可以调用 ungetc 将字符再压送回流中。
#include <stdio.h>
int ungetc(int c, FILE *fp);    /* 返回值:若成功,返回 c;否则,返回 EOF */

    压送回流中的字符以后又可以与压送回的顺序相反的顺序从流中读出。回送的字符,不一定必须是上一次读到的字符。不能回送 EOF,但是当已经到达文件尾端时,仍可以回送一个字符。下次读将返回该字符,再读则返回 EOF。这样做的原因是,一次成功的 ungetc 调用会清除该流的文件结束标记。
    当正在读一个输入流,并进行某种形式的切词或记号切分操作时,会经常用到回送字符操作。有时需要先看一看下一个字符,以决定如何处理当前字符。然后就需要方便地将刚查看的字符回送,以便下一次调用 getc 时返回该字符。
    用 ungetc 压送回字符时,并没有将它们写到底层文件中或设备上,只是将它们写会标准 I/O 库的流缓冲区中。
    对应于上面所述的每个输入函数都有一个输出函数。
#include <stdio.h>
int putc(int c, FILE *fp);
int fputc(int c, FILE *fp);
int putchar(int c);
               /* 返回值:若成功,都返回 c;否则,都返回 EOF */

    同输入函数一样,putchar(c) 等同于 putc(c, stdout),putc 可被实现为宏,而 fputc 不能。

    下面再来介绍一下每次输入一行的函数。
#include <stdio.h>
char *fgets(char *restrict buf, int n, FILE *restrict fp);
char *gets(char *buf);
                 /* 返回值:若成功,返回 buf;若已到达文件尾端或出错,返回 NULL */

    gets 从标准输入读,而 fgets 则从指定的流读。
    对于 fgets,必须指定缓冲的长度 n。此函数一直读到下一个换行符为止,但不超过 n-1 个字符,读入的字符被送入缓冲区。该缓冲区以 null 字节结尾。如若该行包括最后一个换行符的字符数超过 n-1,则 fgets 只返回一个不完整的行,但是,缓冲区总是以 null 字节结尾,下一次调用会继续读该行。
    gets 因为不能指定缓冲区的长度,从而可能造成缓冲区溢出,所以并不推荐使用。它与 fgets 的另一个区别是,gets 并不将换行符存入缓冲区中。
    fputs 和 puts 是用于每次输出一行的函数。
#include <stdio.h>
int fputs(const char *restrict str, FILE *restrict fp);
int puts(const char *str);
                /* 返回值:若成功,都返回非负值;否则,都返回 EOF */

    函数 fputs 将一个以 null 字节终止的字符串写到指定的流,尾端的终止符 null 不写出。不过这并不一定是每次输出一行,因为字符串不需要换行符作为最后一个非 null 字节。puts 将一个以 null 字节终止的字符串写到标准输出,终止符不写出,但随后又将一个换行符写到标准输出。
    注意,如果总是使用 fgets 和 fputs,那么必须记住在每行终止处需要自己处理换行符。

    最后,我们再来讨论一下二进制 I/O 操作函数。
    在进行二进制 I/O 操作时,一般都是一次读或写一个完整的结构。若使用 getc 或 putc,不仅麻烦还且费时;而若使用 fgets 或 fputs,又可能会因结构中含有 null 字节而停止。因此提供了下列两个函数。
#include <stdio.h>
size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);
size_t fwrite(const void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp);
                                 /* 两个函数的返回值:读或写的对象数 */

    这两个函数有两种常见的用法:
    1、读或写一个二进制数组。例如将一个浮点数组的第 2~5个元素写至一个文件上:
         if( fwrite(&data[2], sizeof(float), 4, fp) != 4){ /* 处理错误 */ }
    2、读或写一个结构。例如:
         struct{ /*...*/ }item;
         if( fwrite(&item, sizeof(item), 1, fp) != 1){ /* 处理错误 */ }
    将这两者结合起来,就可读或写一个结构数组。
    fread 和 fwrite 返回读或写的对象数。对于读,如果出错或到达文件尾端,则此数字可以少于 nobj。此时应调用 ferror 或 feof 来判断究竟是哪一种情况。对于写,如果该数字少于 nobj,则表示出错。
    使用二进制 I/O 的基本问题是,它只能用于读在同一系统上已写的数据。这对于现在很多通过网络相连起来的异构系统的情况,它们可能就不能正常工作。在不同系统之间交换二进制数据的实际解决办法是使用互认的规范格式。

    要定位标准 I/O 流,主要有 3 种方法。
    1、ftell 和 fseek 函数,但是它们都假定文件的位置可以存放在一个长整型中。
    2、ftello 和 fseeko 函数,它们使用了 off_t 数据类型代替了长整型。
    3、fgetpos 和 fsetpos 函数,它们使用一个抽象数据类型 fpos_t 记录文件的位置。这种数据类型可以根据需要定义为一个足够大的数,用以记录文件位置。需要移植到非 UNIX 系统上运行的应用程序应当使用这两个函数。
#include <stdio.h>
long ftell(FILE *fp);    /* 返回值:若成功,返回当前文件位置;否则,返回 -1L */
int fseek(FILE *fp, long offset, int whence);  /* 返回值:若成功,返回 0;否则,返回 -1 */
void rewind(FILE *fp);

off_t ftello(FILE *fp);  /* 返回值:若成功,返回当前文件位置;否则,返回 - 1 */
int fseeko(FILE *fp, off_t offset, int whence);  /* 返回值:若成功,返回 0;否则,返回 -1 */

int fgetpos(FILE *restrict fp, fpos_t *restrict pos);
int fsetpos(FILE *fp, const fpos_t *pos);
                        /* 返回值:若成功,都返回 0;否则,都返回非 0 */

    对于二进制文件,其文件位置是从文件起始位置以字节为单位开始度量。ftell 用于二进制文件时的返回值就是这种字节位置。fseek 中的 whence 的值同 lseek 函数,不过 ISO C 并不要求一个实现对二进制文件支持 SEEK_END 规格说明,因为有些系统要求二进制文件的长度是某个幻数的整数倍,结尾非实际内容部分则填充为 0(但是在 UNIX 中则是支持的)。
    对于文本文件,它们的文件当前位置可能不以简单的字节偏移量来度量。因为非 UNIX 系统中可能以不同的格式存放文本文件。为了定位一个文本文件,whence 一定要是 SEEK_SET,而且 offset 只能为 0(后退到文件的起始位置)或是对该文件的 ftell 所返回的值。另外,使用 rewind 函数也可将一个流设置到文件的起始位置。
    除了偏移量的类型是 off_t 以外,ftello/fseeko 函数与 ftell/fseek 相同。
    fgetpos 将文件位置的当前值存入由 pos 指向的对象中,以后调用 fsetpos 时,可以使用此值将流重新定位至该位置。
分享到:
评论

相关推荐

    基于java网上球鞋竞拍系统设计与实现.docx

    基于java网上球鞋竞拍系统设计与实现.docx

    基于bert实现关系三元组抽取python源码+数据集+项目说明.zip

    基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。

    基于java的足球赛会管理系统设计与实现.docx

    基于java的足球赛会管理系统设计与实现.docx

    基于java的婚纱摄影网的设计与实现.docx

    基于java的婚纱摄影网的设计与实现.docx

    基于安卓的美颜相机,可以通过opencv加滤镜,并调整亮度和对比度,可以磨皮,但并不能瘦脸,磨皮时非常卡顿,暂无解决方法.zip

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    基于java的农产品仓库管理系统系统设计与实现.docx

    基于java的农产品仓库管理系统系统设计与实现.docx

    基于Java swing +mysql(Oracle)实现的飞机订票系统项目(含毕业论文+答辩 ppt+双数据库版本源码+图)

    【作品名称】:基于Java swing +mysql(Oracle)实现的飞机订票系统项目(含毕业论文+答辩 ppt+双数据库版本源码) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 系统功能需求 本系统用于远程机票预订,包括远程航班信息查询、机票预订与确认等;主要分为四大功能:查询、订票、退票和管理。 管理员登录、注销 到系统并进行插入、删除、更新以及查看机票后台数据库操作 插入:机票的插入可以按照航班号、班期、公司、座位号、起飞地以及抵达地等等插入数据库。 删除:机票可以按照航班号、起止城市、星期进行删除 3.1.1客户端系统功能 1.普通用户: 查询:根据航班号、航空公司以及目的地查询出票类信息 订票: 根据出发日期和第一航班号预订机票,机票类型分为单 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。不一定能够满足所有人的需求,需要有一定的基础能够看懂代码,能够自行调试代码并解决报错,能够自行添加功能修改代码。

    2018信基广场“红动佛山”春节新媒体营销方案.pptx

    2018信基广场“红动佛山”春节新媒体营销方案.pptx

    #_ssm_100_mysql_基于智慧医疗预约挂号管理系统_.zip

    均包含代码,文章,部分项目包含ppt

    基于java的蜀都天香酒楼的网站设计与实现.docx

    基于java的蜀都天香酒楼的网站设计与实现.docx

    java基于ssm+vue 医院疫情防控管理系统源码 带毕业论文+ppt+sql

    1、开发环境:SSM框架;内含Mysql数据库;VUE技术;内含说明文档 2、项目代码都经过严格调试,代码没有任何bug! 3、该资源包括项目的全部源码,下载可以直接使用! 4、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 5、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。

    基于java的英语单词学习网站设计与实现.docx

    基于java的英语单词学习网站设计与实现.docx

    基于java企业销售人员培训系统设计与实现.docx

    基于java企业销售人员培训系统设计与实现.docx

    2019优益C x 易烊千玺微博营销案结案报告.pptx

    2019优益C x 易烊千玺微博营销案结案报告.pptx

    基于java的单位人事管理系统设计与实现.docx

    基于java的单位人事管理系统设计与实现.docx

    java-ssm+vue图书管理系统实现源码(项目源码-说明文档)

    该网站采用SSM框架和Eclipse编辑器、MySQL数据库设计并实现的。网站功能包含系统用户管理、图书管理、用户管理、借书管理、续借管理、违章缴款管理等模块。 首页是网站的入口,主要包含了:新闻信息、图书信息等导航功能。 用户有独立的注册界面,用户填写好注册信息后,会有个一审核的过程,经过管理员审核注册成功,并将注册的信息加入用户表中。 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7+ 后端技术:ssm 前端技术:Vue 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog

    我的网页设计部署.zip(毕设&课设&实训&大作业&竞赛&项目)

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    信息系统项目管理师考试集锦.zip

    项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用

    【单变量输入多步预测】基于TCN-GRU-Attention的风电功率预测研究附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    docker安装部署gorse

    docker安装部署gorse

Global site tag (gtag.js) - Google Analytics