【C语言】文件的顺序读写

©作者:末央&

©系列:C语言初阶(适合小白入门)
©说明:以凡人之笔墨,书写未来之大梦

在这里插入图片描述

目录

  • 前言
  • 字符输入输出函数 - fgetc和fputc
  • 文本行输入输出函数 - fgets和fputs
  • 格式化输入输出函数 - fscanf和fprintf

前言

对文件数据的读写可以分为顺序读写和随机读写。顺序读写,即挨着顺序对文件中的数据进行输入或输出。

在这片博客中,我们首先介绍文件的顺序读写需要用到的文件操作函数。

字符输入输出函数 - fgetc和fputc

一、fputc函数

int fputc( int c, FILE *stream );

fputc函数的第一个参数是待输出的字符,第二个参数该字符输出的位置,即fputc函数的功能是将一个字符输出到指定的位置。该函数调用完毕会返回用户传入的字符。

例如,我们要将小写字母a~z写入到data.txt文件中。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打开文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打开失败,失败返回}//对文件进行输出字符操作char i = 0;for (i = 'a'; i <= 'z'; i++){fputc(i, pf);}//关闭文件fclose(pf);pf = NULL;return 0;
}

二、fgetc函数

int fgetc( FILE *stream );

fgetc函数只有一个参数,即你要读取的文件的文件指针。fgets函数的功能就是从指定位置读取一个字符。该函数调用成功会返回读取到的的字符;若读取文件时发生错误,或是已经读取到文件末尾,则返回EOF。

例如,我们要将文件data.txt文件中的内容全部读取,并打印到屏幕上。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打开文件FILE* pf = fopen("data.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打开失败,失败返回}//对文件进行输入字符操作int ch = 0;while ((ch = fgetc(pf))!= EOF){printf("%c", ch);}//关闭文件fclose(pf);pf = NULL;return 0;
}

文本行输入输出函数 - fgets和fputs

一、fputs函数

int fputs( const char *string, FILE *stream );

fputs函数的第一个参数是待输出的字符串,第二个参数该字符串输出的位置,即fputs函数的功能是将一个字符串输出到指定的位置(有没有发现fputs函数的参数设计和fputc函数参数的设计非常类似)。该函数调用成功会返回一个非负值;若输出时发生错误,则返回EOF。

例如,我们要将字符串"hello world!"写入到data.txt文件中。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打开文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打开失败,失败返回}//对文件进行输出字符串操作char arr[] = "hello world!";fputs(arr, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

二、fgets函数

char *fgets( char *string, int n, FILE *stream );

fgets函数的第三个参数是你要读取的文件的文件指针,第二个参数是你要读取的字符个数(也可以说是字节个数),第一个参数是你所读取到的数据的储存位置。fgets函数的功能就是从指定位置读取指定字符个数的数据储存到指定位置。该函数调用成功会返回用于储存数据的位置的地址,如果读取过程中发生错误,或是读取到了文件末尾,则返回一个空指针(NULL)。

例如,我们要从data.txt文件中提取数据。

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{//打开文件FILE* pf = fopen("data.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打开失败,失败返回}//对文件进行输入字符串操作char arr[10] = { 0 };fgets(arr, 6, pf);printf("%s\n", arr);//关闭文件fclose(pf);pf = NULL;return 0;
}

fgets函数读取字符的过程中会出现两种情况:

  • 在fgets函数读取到指定字符数之前,若读取到换行符(’\n’),则停止读取,读取带回的字符包含换行符。
  • 直到fgets函数读取到第n-1个字符时都没有遇到换行符(’\n’),则返回读取到的n-1个字符,并在末尾加上一个空字符(一般是\0)一同返回(共n个字符)。

格式化输入输出函数 - fscanf和fprintf

一、fprintf函数

int fprintf( FILE *stream, const char *format [, argument ]...);

fprintf函数的第一个参数是数据输出的目的地,后面的参数博友们可能看不太懂,但是我们可以看看库函数printf函数的函数声明:

int printf( const char *format [, argument]... );
//printf函数的声明

我们发现fprintf函数除了第一个参数以外,其它参数都与printf函数的参数一样,虽然我们不知道fprintf函数后面的参数代表的意思,但是我们会用printf函数啊,所以我们使用fprintf函数传参时可以模仿者printf的传参形式。

例如我们要将一个结构体类型的变量信息输出到data.txt文件中去

#include <stdio.h>
#include <string.h>
#include <errno.h>
struct S
{char name[20];char sex[5];int age;
};
int main()
{//打开文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打开失败,失败返回}//对文件进行格式化输出操作struct S s = { "zhangsan", "nan", 20 };fprintf(pf, "%s %s %d\n", s.name, s.sex, s.age);//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
其实,fprintf函数的功能就是将“区域三”的数据,以“区域二”的格式输出到“区域一”

二、fscanf函数

int fscanf( FILE *stream, const char *format [, argument ]... );

fscanf函数的第一个参数是读取数据的位置,后面的参数我们也可以类比scanf函数的参数:

int scanf( const char *format [,argument]... );

我们可以看到fscanf函数的参数也是,除了第一个参数以外,其他参数就是scanf函数的参数,于是我们可以试着尝试使用。

例如,我们要将刚才用fprintf函数输出到data.txt文件中的数据读取出来。

#include <stdio.h>
#include <string.h>
#include <errno.h>
struct S
{char name[20];char sex[5];int age;
};
int main()
{//打开文件FILE* pf = fopen("data.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;//文件打开失败,失败返回}//对文件进行格式化输入操作struct S tmp = { 0 };fscanf(pf, "%s %s %d", tmp.name, tmp.sex, &(tmp.age));printf("%s %s %d\n", tmp.name, tmp.sex, tmp.age);//将tmp中的内容打印出来,看是否读取成功//关闭文件fclose(pf);pf = NULL;return 0;
}

在这里插入图片描述
其实,fscanf函数的功能就是将“区域一”的数据,以“区域二”的格式输入到“区域三”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/39766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity3D 打造基于AStar的寻路与导航详解

在游戏开发中&#xff0c;寻路与导航是一个至关重要的功能&#xff0c;它能够使游戏角色自动找到最优路径&#xff0c;避开障碍物&#xff0c;实现自动导航&#xff0c;从而提升游戏体验。AStar&#xff08;A*&#xff09;算法作为一种广泛应用的寻路算法&#xff0c;因其高效性…

关于多线程的使用方法

多线程在python中应用比较广泛&#xff0c;但是因为python中有GIL锁的缘故&#xff0c;在多线程中看起来是并发的执行的&#xff0c;在宏观上是并发执行的&#xff0c;但是在微观上是一个接着一个执行。 在python中使用多线程比较简单&#xff0c;是一套固定的模版。 from qu…

PHP利用GD库实现图片合成功能方法

在程序项目开发的过程中我们免不了要实现一种功能。例如海报的生成&#xff0c;照片和文字合成一张新的图片。php中怎么实现 实现功能 文字和照片合成一张新的照片&#xff0c;并且自适应换行并加上签名和日期&#xff0c;加上字体样式&#xff0c;下面我们就开实现该功能 实现…

Seal^_^【送书活动第8期】——《ChatGLM3大模型本地化部署、应用开发与微调》

Seal^_^【送书活动第8期】——《ChatGLM3大模型本地化部署、应用开发与微调》 一、参与方式二、本期推荐图书2.1 作者建语2.2 编辑推建2.3 图书简介2.4 前 言2.5 目 录 三、正版购买 大模型领域 既是繁星点点的未知宇宙&#xff0c;也是蕴含无数可能的广阔天地&#xff0c; 正…

深入理解 Linux 内核架构

目录 引言内核概念Linux 内核的基本组成 进程管理内存管理文件系统设备驱动网络栈内核结构 内核态与用户态内核模块系统调用中断与异常处理内核同步机制Linux 内核使用场景常用的内核命令与工具内核调试与性能优化总结 1. 引言 Linux 内核是现代计算机系统的核心组件之一&am…

python--基础知识点--协程

协程由用户态控制&#xff0c;不由内核控制1个线程中可以开很多协程协程切换是在用户态控制不由内核控制&#xff0c;切换时资源开销小使用方式&#xff1a;async def、await可等待对象(协程对象、Future对象、task对象(是Future对象的子类)->io等待)、事件循环使用场景&…

idea创建自定义的maven spark scala archetype脚手架

一&#xff1a;先创建一个Maven项目net.alchim31.maven&#xff08;选该模板&#xff0c;得要等一会儿才能加载出来&#xff09; 之后将自己的目录结构建立好&#xff0c;最好不要有空目录&#xff0c;可能会因为没有文件在install的时候编译不进去 pom中内容也按照自己的需要改…

Stable Diffusion web UI 插件

2024.7.3更新&#xff0c;持续更新中 如果需要在linux上自己安装sd&#xff0c;参考&#xff1a;stable diffusion linux安装 插件复制到 /stable-diffusion-webui/extensions 目录下&#xff0c;然后重新启动sd即可 一、插件安装方法 每种插件的安装方法可能略有不同&#xf…

苹果p12证书最简单最新申请流程

使用uniapp打包&#xff0c;在ios上打正式包需要苹果的p12证书和证书profile文件&#xff0c;点进去uniapp的ios证书申请教程&#xff0c;通篇就是使用mac电脑申请的教程&#xff0c;假如没有mac电脑就无法继续了。 因此&#xff0c;假如没有mac电脑的同志们&#xff0c;可以参…

高薪程序员必修课-Java中为什么不建议使用Executors来创建线程池?

目录 前言 原因分析 1. newFixedThreadPool 和 newSingleThreadExecutor 示例&#xff1a; 2. newCachedThreadPool 示例&#xff1a; 建议的替代方法 示例&#xff1a; 解释&#xff1a; 总结 前言 在Java中&#xff0c;Executors 类提供了几个工厂方法来创建不同类型…

RAG开源项目Qanything源码阅读3-在线推理

原文&#xff1a;前沿重器[47] | RAG开源项目Qanything源码阅读3-在线推理 项目&#xff1a;https://github.com/netease-youdao/QAnything 第一篇&#xff1a;RAG开源项目Qanything源码阅读1-概述服务 第二篇&#xff1a;RAG开源项目Qanything源码阅读2-离线文件处理 0&#x…

Pytest+Allure+Yaml+PyMsql+Jenkins+Gitlab接口自动化(五)Jenkins配置

一、背景 Jenkins&#xff08;本地宿主机搭建&#xff09; 拉取GitLab(服务器)代码到在Jenkins工作空间本地运行并生成Allure测试报告 二、框架改动点 框架主运行程序需要先注释掉运行代码&#xff08;可不改&#xff0c;如果运行报allure找不到就直接注释掉&#xff09; …

中英双语介绍美国的州:路易斯安那州(Louisiana)

中文版 路易斯安那州简介 路易斯安那州位于美国南部&#xff0c;以其丰富的历史文化、多样的自然景观和独特的音乐和美食传统而闻名。以下是对路易斯安那州的详细介绍&#xff0c;包括其地理位置、人口、经济、教育、文化和主要城市。 地理位置 路易斯安那州东临密西西比州…

鸿蒙应用开发-时间屏幕

点击下载源码&#xff1a; https://download.csdn.net/download/liuhaikang/89509449 做一个时间屏幕&#xff0c;可以点击切换白色和黑色&#xff0c;有渐变效果&#xff0c;使用到了鸿蒙的动画效果。 在这个设计中&#xff0c;我们首先引入了通用能力包&#xff0c;以实现功…

Kubernetes 离线安装的坑我采了

Kubernetes 离线安装的坑我采了 一、Error from server: Get "https://xx.xx.xx.xx:10250/containerLogs/kube-system/calico-node-8dnvs/calico-node": tls: failed to verify certificate: x509: certificate signed by unknown authority二、calico 或 pod 启动正…

cesium公交车轨迹漫游

个人博客&#xff1a;CSDN 博客-满分观察网友 z 演示地址&#xff1a;哔哩哔哩-满分观察网友 z 这是一个用 Cesium.js 做的公交车轨迹漫游&#xff0c;实现的功能有加载站点和道路轨迹点数据、监听车辆的实时位置、车辆控制器。滚动屏等等。 文章目录 1. 地图初始化2. 数据渲…

【高中数学/基本不等式】已知:x,y均为正实数,且xy+2x+y=4 求:x+y的最小值?

【问题】 已知&#xff1a;x,y均为正实数&#xff0c;且xy2xy4 求&#xff1a;xy的最小值&#xff1f; 【来源】 https://www.ixigua.com/7147585275823292942?logTagf25494de7fce23a3a3d0 【解答】 解&#xff1a; 由xy2xy4 两边加二得 xy2xy24 2 分解因式得 (x1)(…

0090__【Git系列】merge和rebase的区别

【Git系列】merge和rebase的区别_rebase和merge的区别-CSDN博客 git中rebase和merge的区别是什么-git-PHP中文网 https://blog.51cto.com/qzcsbj/9444199

从零搭建教育管理系统:Java + Vue.js 教学-02

第三步:创建实体类和 Mapper 接口 现在我们已经设计好了数据库表,接下来使用 MyBatis-Plus 将这些表映射到 Java 对象,以便在代码中轻松地进行操作。 1. 创建实体类 在 src/main/java/<your_package>/entity 目录下 (如果没有该目录,请手动创建),创建与数据库表对应…

MyBatis(20)MyBatis 事务管理如何实现

MyBatis 的事务管理是通过底层 JDBC 连接的事务管理机制来实现的。事务管理对于任何涉及多个数据库操作的应用程序来说都是至关重要的&#xff0c;它确保数据的一致性和完整性。在 MyBatis 中&#xff0c;事务管理可以通过 SQL 会话&#xff08;SqlSession&#xff09;来实现。…