当前位置: 首页 > news >正文

椋鸟C语言笔记#33:文件的顺序读写

萌新的学习笔记,写错了恳请斧正。


目录

光标(文件位置指示器)

文件的顺序读写

fgetc

使用实例

fputc

使用实例

fgets

fputs

使用实例

fscanf

fprintf

fread

fwrite

使用实例


光标(文件位置指示器)

我们平常打字的时候就知道光标这个概念,而程序在打开文件后也是有一个光标,用于控制文件的读写。我们一般说文件指针指向文件的哪个位置,其实就是光标(文件位置指示器)指向文件的某个位置,而这个信息也是保存在对应流的结构体中的。

读和写操作都是从光标的位置进行,而光标的位置也随着读写移动

文件的顺序读写

文件的顺序读写就是从光标的位置开始,按顺序向后读写内容

文件顺序读写时我们没法随意控制光标的位置,只能让系统自己控制光标

fgetc
#include <stdio.h>
int fgetc( FILE* stream );

fgetc是字符输入函数,从指定的输入流读取下一个字符,并返回这个字符

如果读取失败则返回EOF,但是遇到文件尾导致的读取失败会设置流结构体上的文件尾指示器(这是有用的,后面feof函数会讲),而其他错误导致的失败会设置流结构体上的错误指示器(这在ferror函数中用得到)

其实getchar其实就可以理解为fgetc(stdin),从标准流读一个字符

但是注意:尽量使stream不要是一个带有副作用的表达式(它被重复计算)

使用实例

其中的错误处理部分暂且不表,后面讲

#include <stdio.h>
#include <stdlib.h>int main()
{FILE* fp = fopen("test.txt", "r");if (!fp){perror("File opening failed");return EXIT_FAILURE;}int c;  // 注意:int,非char,要求处理EOFwhile ((c = fgetc(fp)) != EOF)  // 标准C I/O读取文件循环{ putchar(c);}if (ferror(fp))puts("I/O error when reading");else if (feof(fp))puts("End of file reached successfully");fclose(fp);fp = NULL;return EXIT_SUCCESS;
}
fputc
#include <stdio.h>
int fputc( int ch, FILE* stream );

fputc是字符输出函数,向指定的输入流输出字符,并返回这个字符

如果输出失败则返回EOF并设置流结构体上的错误指示器

其实putchar(ch)其实就可以理解为fputc(ch, stdin),向标准流输出一个字符

但是注意:尽量使stream不要是一个带有副作用的表达式(它被重复计算)

使用实例

其中的错误处理部分暂且不表,后面讲

#include <stdio.h>
#include <stdlib.h>int main()
{int ret_code = 0;for (char c = 'a'; (ret_code != EOF) && (c <= 'z'); c++)ret_code = putc(c, stdout);/* 测试是否抵达 EOF */if (ret_code == EOF)if (ferror(stdout)){perror("putc()");fprintf(stderr, "putc() failed in file %s at line # %d\n", __FILE__, __LINE__ - 7);exit(EXIT_FAILURE);}putc('\n', stdout);return EXIT_SUCCESS;
}
fgets
#include <stdio.h>
char* fgets( char* str, int count, FILE* stream );

fgets是文本行输入函数,从指定的输入流读取最多count-1个字符并将其存储在str所指向的字符数组(以覆写的形式,不会清除原本内容),若是遇到文件尾或换行符则提前结束输入。如果是遇到换行符结束,那么str的结尾也将包含一个换行符;如果是遇到文件尾结束,那么str的结尾没有换行符。只要没有出错,读取的字符串结尾都会补上'\0'。

  • 如果读取成功,则返回值就是str
  • 如果一个字符都没读取就直接遇到文件尾,则判定为失败,返回NULL且不会以'\0'覆写str的首字节,同时设置流结构体的文件尾指示器
  • 如果遇到其他错误导致失败,则设置流结构体的错误指示器和errno,此时str数组会发生什么谁也不知道

count小于等于1的情况是未定义的,不要这么做

fputs
#include <stdio.h>
int fputs( const char* str, FILE* stream );

fputs是文本行输出函数,向指定的输出流(stream)输出以'\0'结尾的字符串str的每一个字符(空字符不被写入)。如果输出成功,返回一个非负值(未定义,有些编译器返回写入的字符数,有些返回最后一个字符);如果输出失败,返回EOF并设置流结构体的错误指示器和errno。

fputs与puts还有一个区别,puts在输出后会再多输出一个换行符,fputs不会

使用实例
#include <stdio.h>int main()
{int rc = fputs("Hello world!", stdout);if (rc == EOF)perror("fputs()");return EXIT_SUCCESS;
}
fscanf
#include <stdio.h>
int fscanf( FILE* stream, const char* format, ... );

fscanf相比scanf除了可以选择从任意流stream输入外就没有什么区别了,都有被读字符串(应当以'\0'结尾)和可变参数列表。返回值为成功接受参数的数量(可以为0)。

直接遇到文件尾或读取失败则返回EOF,并设置流结构体上相关指示器

fprintf
#include <stdio.h>
fprintf( FILE* stream, const char* format, ... );

fprintf相比printf除了可以选择向任意流stream输出外就没有什么区别了,都有格式控制字符串和可变参数列表。返回值为输出到流的字符数,如果输出错误或者编码错误则返回一个负值(未定义)。

fread
#include <stdio.h>
size_t fread( void* buffer, size_t size, size_t count, FILE* stream );

fread是二进制输入函数,从指定流stream读取最多count个大小为size字节的对象到数组buffer中。读取成功则返回读取的对象数;读取出现错误或文件尾,返回值是小于count的未定义值并设置流结构体上相关指示器;如果size或count是零则返回零且不进行其他动作。

官网上描述如下:

如同转译每个对象为 unsigned char 数组,并对每个对象调用 size 次 fputc 以将那些 unsigned char 按顺序写入 stream 一般写入。文件位置指示器前进写入的字节数。

fwrite

fread是二进制输出函数,从数组buffer向指定流stream输出最多count个大小为size字节的对象。输出成功则返回读取的对象数;输出出现错误,返回值是小于count的未定义值如果size或count是零则返回零且不进行其他动作。

官网上描述如下:

如同转译每个对象为 unsigned char 数组,并对每个对象调用 size 次 fputc 以将那些 unsigned char 按顺序写入 stream 一般写入。文件位置指示器前进写入的字节数。

使用实例

 其中fseek函数用于移动光标,后面随机读写会讲

#include <stdio.h>
#include <stdlib.h>struct Stu
{char name[20];int age;float score;
};int main()
{struct Stu s = { "zhangsan", 20, 99.9 };struct Stu d = { 0 };FILE* pf = fopen("dat.txt", "w+b");if (!pf){perror("fopen");return EXIT_FAILURE;}fwrite(&s, sizeof(s), 1, pf);fseek(pf, 0, SEEK_SET);fread(&d, sizeof(s), 1, pf);printf("%s %d %.1f", d.name, d.age, d.score);fclose(pf);pf = NULL;return EXIT_SUCCESS;
}

相关文章:

椋鸟C语言笔记#33:文件的顺序读写

萌新的学习笔记&#xff0c;写错了恳请斧正。 目录 光标&#xff08;文件位置指示器&#xff09; 文件的顺序读写 fgetc 使用实例 fputc 使用实例 fgets fputs 使用实例 fscanf fprintf fread fwrite 使用实例 光标&#xff08;文件位置指示器&#xff09; 我们…...

Transformer - Attention is all you need 论文阅读

虽然是跑路来NLP&#xff0c;但是还是立flag说要做个project&#xff0c;结果kaggle上的入门project给的例子用的是BERT&#xff0c;还提到这一方法属于transformer&#xff0c;所以大概率读完这一篇之后&#xff0c;会再看BERT的论文这个样子。 在李宏毅的NLP课程中多次提到了…...

安装配置Flink

安装配置Flink 1.上传安装包到Linux 2.解压到指定路径 tar -zxf ./flink-1.14.0-bin-scala_2.12.tgz /usr/local/src/3.修改环境变量 vi ~/.bashrc#往最后加入 export FLINK_HOME /usr/local/src/flink-1.14.0/ export PATH$PATH:$FLINK_HOME/bin#激活环境变量 source ~/.…...

解决Spss没有创建虚拟变量的选项的问题

这个是今天用spss想创建虚拟变量然后发现我的spss没有。 然后能怎么办我就百度呗&#xff0c; 说是在扩展里连接扩展中心 天哪&#xff0c;谁能连上&#xff0c;我连不上 于是就找到了从github上下载到本地&#xff0c;然后安装到spss中 目录 解决方法 点击code 再点击D…...

wxWidgets实战:使用mpWindow绘制阻抗曲线

选择模型时&#xff0c;需要查看model的谐振频率&#xff0c;因此需要根据s2p文件绘制一张阻抗曲线。 如下图所示&#xff1a; mpWindow 左侧使用mpWindow&#xff0c;右侧使用什么&#xff1f; wxFreeChart https://forums.wxwidgets.org/viewtopic.php?t44928 https://…...

深度学习15—(迁移学习)冻结和解冻神经网络模型的参数

冻结与解冻代码&#xff1a; def freeze_net(net):if not net:returnfor p in net.parameters():p.requires_grad Falsedef unfreeze_net(net):if not net:returnfor p in net.parameters():p.requires_grad True 这段代码定义了两个函数&#xff1a;freeze_net 和 unfree…...

强化学习应用(八):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个价值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…...

常见面试题之HTML

行内元素有哪些&#xff1f;块级元素有哪些&#xff1f; 空(void)元素有那些&#xff1f; HTML 中的行内元素&#xff08;inline elements&#xff09;通常用于在一行内显示&#xff0c;不会独占一行的空间。常见的行内元素有&#xff1a; <span>&#xff1a;用于对文本…...

数据结构与算法教程,数据结构C语言版教程!(第三部分、栈(Stack)和队列(Queue)详解)六

第三部分、栈(Stack)和队列(Queue)详解 栈和队列&#xff0c;严格意义上来说&#xff0c;也属于线性表&#xff0c;因为它们也都用于存储逻辑关系为 "一对一" 的数据&#xff0c;但由于它们比较特殊&#xff0c;因此将其单独作为一章&#xff0c;做重点讲解。 使用栈…...

使用Docker部署PDF多功能工具Stirling-PDF

1.服务器上安装docker 安装比较简单&#xff0c;这种安装的Docker不是最新版本&#xff0c;不过对于学习够用了&#xff0c;依次执行下面命令进行安装。 sudo apt install docker.io sudo systemctl start docker sudo systemctl enable docker 查看是否安装成功 $ docker …...

linux安装系统遇到的问题

这两天打算攻克下来网络编程&#xff0c;发现这也确实是很重要的一个东西&#xff0c;但我就奇了怪了&#xff0c;老师就压根没提&#xff0c;反正留在我印象的就一个tcp/ip七层网络。也说正好&#xff0c;把linux命令也熟悉熟悉&#xff0c;拿着我大一课本快速过过 连接cento…...

groovy XmlParser 递归遍历 xml 文件,修改并保存

使用 groovy.util.XmlParser 解析 xml 文件&#xff0c;对文件进行修改&#xff08;新增标签&#xff09;&#xff0c;然后保存。 是不是 XmlParser 没有提供方法遍历每个节点&#xff0c;难道要自己写&#xff1f; 什么是递归&#xff1f; 不用说&#xff0c;想必都懂得~ …...

小程序基础学习(多插槽)

先创建插槽 定义多插槽的每一个插槽的属性 在js文件中启用多插槽 在页面使用多插槽 组件代码 <!--components/my-slots/my-slots.wxml--><view class"container"><view class"left"> <slot name"left" ></slot>&…...

爬虫补环境jsdom、proxy、Selenium案例:某条

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、简介 爬虫逆向补环境的目的是为了模拟正常用户的行为&#xff0c;使爬虫看起来更像是一个真实的用户在浏览网站。这样可以…...

电子学会C/C++编程等级考试2021年09月(四级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:最佳路径 如下所示的由正整数数字构成的三角形: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。你的任务就是求出最佳路径…...

DevExpress历史安装文件包集合

Components - DevExpress.NET组件安装包此安装程序包括所有 .NET Framework、.NET Core 3 和 .NET 5、ASP.NET Core 和 HTML/JavaScript 组件和库&#xff08;Web和桌面应用程序开发只需要安装此文件即可&#xff09;。 注意&#xff1a;自DevExpress21.1版本之后&#xff0c;该…...

科技云报道:“存算一体”是大模型AI芯片的破局关键?

科技云报道原创。 在AI发展历史上&#xff0c;曾有两次“圣杯时刻”。 第一次发生在2012年10月&#xff0c;卷积神经网络&#xff08;CNN&#xff09;算法凭借比人眼识别更低的错误率&#xff0c;打开了计算机视觉的应用盛世。 第二次是2016年3月&#xff0c;DeepMind研发的…...

watch监听一个对象中的属性 - Vue篇

vue中提供了watch方法&#xff0c;可以监听data内的某些数据的变动&#xff0c;触发相应的方法。 1.监听一个对象 <script>export default {data() {return {obj: {name: ,code: ,timePicker:[]}}},watch: {obj: {handler(newVal, oldVal) {//todo},immediate: true,deep…...

Spark---RDD序列化

文章目录 1 什么是序列化2.RDD中的闭包检查3.Kryo 序列化框架 1 什么是序列化 序列化是指 将对象的状态信息转换为可以存储或传输的形式的过程。 在序列化期间&#xff0c;对象将其当前状态写入到临时或持久性存储区。以后&#xff0c;可以通过从存储区中读取或反序列化对象的…...

Xtuner大模型微调

Xtuner大模型微调 一、课程笔记 文档链接&#xff1a;https://github.com/InternLM/tutorial/blob/main/xtuner/README.md 视频链接&#xff1a; https://www.bilibili.com/video/BV1yK4y1B75J/ 大模型微调 大模型的训练利用了各类数据&#xff0c;可以说是一个通才&#xff…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...