椋鸟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:文件的顺序读写
萌新的学习笔记,写错了恳请斧正。 目录 光标(文件位置指示器) 文件的顺序读写 fgetc 使用实例 fputc 使用实例 fgets fputs 使用实例 fscanf fprintf fread fwrite 使用实例 光标(文件位置指示器) 我们…...
Transformer - Attention is all you need 论文阅读
虽然是跑路来NLP,但是还是立flag说要做个project,结果kaggle上的入门project给的例子用的是BERT,还提到这一方法属于transformer,所以大概率读完这一篇之后,会再看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没有。 然后能怎么办我就百度呗, 说是在扩展里连接扩展中心 天哪,谁能连上,我连不上 于是就找到了从github上下载到本地,然后安装到spss中 目录 解决方法 点击code 再点击D…...
wxWidgets实战:使用mpWindow绘制阻抗曲线
选择模型时,需要查看model的谐振频率,因此需要根据s2p文件绘制一张阻抗曲线。 如下图所示: mpWindow 左侧使用mpWindow,右侧使用什么? wxFreeChart https://forums.wxwidgets.org/viewtopic.php?t44928 https://…...
深度学习15—(迁移学习)冻结和解冻神经网络模型的参数
冻结与解冻代码: 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 这段代码定义了两个函数:freeze_net 和 unfree…...
强化学习应用(八):基于Q-learning的无人机物流路径规划研究(提供Python代码)
一、Q-learning简介 Q-learning是一种强化学习算法,用于解决基于马尔可夫决策过程(MDP)的问题。它通过学习一个价值函数来指导智能体在环境中做出决策,以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…...
常见面试题之HTML
行内元素有哪些?块级元素有哪些? 空(void)元素有那些? HTML 中的行内元素(inline elements)通常用于在一行内显示,不会独占一行的空间。常见的行内元素有: <span>:用于对文本…...
数据结构与算法教程,数据结构C语言版教程!(第三部分、栈(Stack)和队列(Queue)详解)六
第三部分、栈(Stack)和队列(Queue)详解 栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,因此将其单独作为一章,做重点讲解。 使用栈…...
使用Docker部署PDF多功能工具Stirling-PDF
1.服务器上安装docker 安装比较简单,这种安装的Docker不是最新版本,不过对于学习够用了,依次执行下面命令进行安装。 sudo apt install docker.io sudo systemctl start docker sudo systemctl enable docker 查看是否安装成功 $ docker …...
linux安装系统遇到的问题
这两天打算攻克下来网络编程,发现这也确实是很重要的一个东西,但我就奇了怪了,老师就压根没提,反正留在我印象的就一个tcp/ip七层网络。也说正好,把linux命令也熟悉熟悉,拿着我大一课本快速过过 连接cento…...
groovy XmlParser 递归遍历 xml 文件,修改并保存
使用 groovy.util.XmlParser 解析 xml 文件,对文件进行修改(新增标签),然后保存。 是不是 XmlParser 没有提供方法遍历每个节点,难道要自己写? 什么是递归? 不用说,想必都懂得~ …...
小程序基础学习(多插槽)
先创建插槽 定义多插槽的每一个插槽的属性 在js文件中启用多插槽 在页面使用多插槽 组件代码 <!--components/my-slots/my-slots.wxml--><view class"container"><view class"left"> <slot name"left" ></slot>&…...
爬虫补环境jsdom、proxy、Selenium案例:某条
声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关 一、简介 爬虫逆向补环境的目的是为了模拟正常用户的行为,使爬虫看起来更像是一个真实的用户在浏览网站。这样可以…...
电子学会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 组件和库(Web和桌面应用程序开发只需要安装此文件即可)。 注意:自DevExpress21.1版本之后,该…...
科技云报道:“存算一体”是大模型AI芯片的破局关键?
科技云报道原创。 在AI发展历史上,曾有两次“圣杯时刻”。 第一次发生在2012年10月,卷积神经网络(CNN)算法凭借比人眼识别更低的错误率,打开了计算机视觉的应用盛世。 第二次是2016年3月,DeepMind研发的…...
watch监听一个对象中的属性 - Vue篇
vue中提供了watch方法,可以监听data内的某些数据的变动,触发相应的方法。 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 什么是序列化 序列化是指 将对象的状态信息转换为可以存储或传输的形式的过程。 在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的…...
Xtuner大模型微调
Xtuner大模型微调 一、课程笔记 文档链接:https://github.com/InternLM/tutorial/blob/main/xtuner/README.md 视频链接: https://www.bilibili.com/video/BV1yK4y1B75J/ 大模型微调 大模型的训练利用了各类数据,可以说是一个通才ÿ…...
如何快速批量下载知网文献?CNKI-download自动化工具终极指南
如何快速批量下载知网文献?CNKI-download自动化工具终极指南 【免费下载链接】CNKI-download :frog: 知网(CNKI)文献下载及文献速览爬虫 项目地址: https://gitcode.com/gh_mirrors/cn/CNKI-download 对于学术研究者和学生来说,从知网࿰…...
像素史诗落地企业知识库:用Pixel Epic构建内部行业情报自动摘要系统
像素史诗落地企业知识库:用Pixel Epic构建内部行业情报自动摘要系统 1. 企业知识管理的新挑战 在信息爆炸的时代,企业面临的最大挑战不是获取信息,而是如何从海量数据中提取有价值的知识。传统知识管理系统存在几个关键痛点: 信…...
超高压输电线路空载运行时的电压升高现象解析
1. 为什么空载时线路末端电压会升高? 第一次接触超高压输电线路时,很多工程师都会对这个现象感到困惑:明明没有接任何用电设备,为什么线路末端的电压反而比始端更高?这就像往一根长长的水管里注水,结果发现…...
租车宝 token、payload算法分析
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 部分python代码 url "/queryOr…...
8种Prompt优化技巧:解决大模型输出不稳定痛点
8种Prompt优化技巧:解决大模型输出不稳定痛点 在大模型应用落地过程中,开发者常遇到输出结果不可控的问题:同样的需求多次调用返回内容差异巨大、回答偏离核心要求、格式混乱无法直接解析,这些问题严重影响业务流程的稳定性和用户…...
离谱了,简历写了这个项目薪资直接涨了 80%!!
报喜了!!!前阵子帮一个粉丝修改简历,只是在项目经历里加了一个“不起眼”的项目,优化了表述逻辑,没想到他面试3家公司,2家给了offer,薪资直接比上一份涨了80%!其实很多人…...
【卷积神经网络作业实现人脸的关键点定位功能】
下面是完成这道题目的代码:import os import cv2 import numpy as np import pandas as pd import torch import torch.nn as nn from torch.utils.data import Dataset,DataLoader from torchvision import transforms import matplotlib.pyplot as plt1. 数据集定…...
3GPP TS 23.256标准解读:无人机广播远程识别码(Broadcast Remote ID)到底是怎么工作的?
3GPP TS 23.256标准深度解析:无人机广播远程识别码的技术实现与合规路径 当一架无人机在城市上空盘旋时,地面人员如何快速确认它的合法身份?监管机构又该如何在密集的无线电环境中精准捕捉每一架飞行器的信息?这些问题的答案&…...
能做表格的 AI 软件:Excel-Agent,AI 原生重构表格数据分析全流程
当传统 Excel 被卡顿、复杂公式、海量数据难处理、手动重复操作困住时,能做表格的 AI 软件正成为效率破局关键 —— 而 Excel-Agent,正是专为 Excel 场景打造的 AI 数据智能体,以自然语言交互、本地高效计算、全链路数据处理能力,…...
【Windows】终止进程、杀掉进程、结束进程
使用资源监视器在任务管理器中点击"性能"选项卡点击"打开资源监视器"切换到"CPU"选项卡在"关联的句柄"搜索框中输入 ui_demo.exe找到对应的进程后,右键点击并选择"结束进程"...
