【Linux】学习-深入了解文件的读与写
深入了解语言级别(C语言)文件操作的"读"与"写"
在学习前,我们先要知道在Linux下的一个原则:一切皆是文件
如何理解呢?举个外设的例子,比如键盘和显示器,这两个外设也可以其实本质上也是文件,通过与内存的交互来交换信息,而交互的过程其实就是"读"与"写"的过程。而键盘和显示器这两个文件是会默认被打开的。
所以想要理解读与写,也就是对文件操作,那就必须得从内存的角度去看待问题:
- 从“人”的角度看,人读书写字,这个过程其实就是,书通过文字来传达出信息,人读取信息后,并记录文字在纸上。人读书其实就是向人大脑进行的一个输入知识的过程,这个过程称为“读”,人记录信息文字在纸上,也就是人大脑向纸进行输出的过程,这个过程称为“写”。
- 从“内存”的角度看,以显示器和键盘这两个文字为例,键盘就好比书上的文字,内存读取键盘时,就相当于人读取信息的过程,相对于内存而言,这是一种输入,人通过键盘向内存传达信息,也就是内存输入信息的过程,也就是“读”。而内存向显示器上打印文字的过程,就好比人在纸上写字的过程,这是内存对外的一个输出过程,也就是“写”。
因此,从内存的角度来看问题的话,一切都简单起来了:
键盘无外乎就是一种“读”:对应C/C++就是:scanf,cin,是input:输入的过程
显示器无外乎就是一种“写”:对应C/C++就是:printf,cout,是output:输出的过程
这样我们再来看看:什么是文件呢?
文件:站在系统的角度,能够被input或者output写出的设备就叫文件!!
狭义上的文件:普通磁盘文件。
广义上的文件:显示器,键盘,网卡,声卡,显卡,磁盘,几乎所有的外设,都可以称为文件!
语言级文件读写操作函数
学习完这个小知识,接下来就来看看文件读写操作的相关语言级别的函数:
功能 | 函数名 | 适用于 |
---|---|---|
字符输入函数 | fgetc | 所有输入流->读 |
字符输出函数 | fputc | 所有输出流->写 |
文本行输入函数 | fgets | 所有输入流->读 |
文本行输出函数 | fputs | 所有输出流->写 |
格式化输入函数 | fscanf | 所有输入流->读 |
格式化输出函数 | fprintf | 所有输出流->写 |
二进制输入 | fread | 文件 |
二进制输出 | fwrite | 文件 |
fgetc和fputc
int fputc( int c, FILE *stream ); int fgetc( FILE *stream );
fputc是一种写操作,属于输出流,能够向指定文件种写入一个char类型,可以理解成:char put file(字符放入文件),若失败则返回EOF
fgetc是一种读操作,属于输入流,能够读取指定文件的一个字符,若读取失败,则返回EOF
代码演示:
int main()
{//以键盘显示器为例://键盘显示器是默认打开的文件,因此不用进行open和close操作int ch=0;while((ch=fgetc(stdin))!=EOF){fputc(ch,stdout);}return 0;
}
fgets 和 fputs
int fputs( const char *string, FILE *stream ); char *fgets( char *s, int size, FILE *stream );
fputs 和 fgets 类似于fputc 和 fgetc
fputs 是一种写操作,属于输出流,能够向指定文件种写入一个string类型,可以理解成:char put string(字符串放入文件,但不包括 ‘\0’ ),若失败则返回EOF
fgets 是一种读操作,属于输入流,能够读取指定文件中至多比size大小小1的字符串然后将他放入指定的buffer,若提前遇到EOF文件末尾或者 ‘\n’ 则读取提前终止,‘\n’ 也会被读入,读入完成后将自动填充 ‘\0’ 。若读取成功则返回s字符串,失败或者什么都没读取到则返回NULL
代码示例:
int main()
{//以键盘显示器为例://键盘显示器是默认打开的文件,因此不用进行open和close操作char buffer[64];while((fgets(buffer,sizeof buffer,stdin)!=NULL)){fputs(buffer,stdout);}return 0;
}
fscanf 和 fprintf
int fscanf(FILE *stream,const char *format,...); int fprintf(FILE *stream,const char *format,...);
fscanf文档介绍:
The scanf() family of functions scans input according to format as described below. This format may contain conversion specifications; the results from such conversions, if any, are stored in the locations pointed to by the pointer arguments that follow format. Each pointer argument must be of a type that is appropriate for the value returned by the corresponding conversion specification.
If the number of conversion specifications in format exceeds the number of pointer arguments, the results are undefined. If the number of pointer arguments exceeds the number of conversion specifications, then the excess pointer arguments are evaluated, but are otherwise ignored. These functions return the number of input items successfully matched and assigned, which can be fewer than provided for, or even zero in the event of an early matching
failure. The value EOF is returned if the end of input is reached before either the first successful conversion or a matching failure occurs. EOF is also returned if a read error
occurs, in which case the error indicator for the stream (see ferror(3)) is set, and errno is set indicate the error.fprintf文档介绍:
The functions in the printf() family produce output according to a format as described below. fprintf() write output to the given output stream;Upon successful return, these functions return the number of characters printed
(excluding the null byte used to end output to strings).If an output error is encountered, a negative value is returned.
fscanf 是一种 ”读” 操作,属于一种输入流,他可以向指定的文件中读取信息并放入格式化参数中, 但若读取的信息大于格式化参数的大小,则结果就不被定义,读取成功则返回读取的信息的数量,失败则返回EOF
fprintf 是一种 “写” 操作,属于一种输出流,他可以向指定文件中写入指定的格式化参数,写入成功则返回写入的char类型的数量但不包括 ’\0‘ ,如果失败则返回一个负值
他们两个的用法其实跟scanf和printf一致,只不过需要指定对应的文件流,而scanf和printf则默认第一个参数为stdin和stdout。
代码示例:
int main()
{//以键盘显示器为例://键盘显示器是默认打开的文件,因此不用进行open和close操作char s[20];while(fscanf(stdin,"%s",&s)!=EOF)fprintf(stdout,"%s\n",s);return 0;
}
注意格式化的使用方法,遇到空格就代表一个占位符的读取已经读取完毕,若空格后还有单词且没有新的占位符就不会进行读入。
fwrite和fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
fwrite 是一种 “写” 操作,属于输出流,可以从内存中指定位置的数据中取出数据向指定文件中写入基本单位大小为size,个数为nmemb个size单位的数据(包括二进制数据),若写入成功则返回实际写入的基本单位的个数
fread 是一种 “读” 操作,属于输入流,可以从指定文件中读取基本单位大小为size,个数为nmemb个size单位的数据(包括二进制数据)放入被指向的内存位置中,若读取成功则返回实际读取的基本单位的个数
int main()
{FILE* fp=fopen("log.txt","w");if(fp==NULL){perror("fopen");}const char* s1="hello fwrite\n";fwrite(s1,strlen(s1),1,fp);if(fwrite){fwrite(s1,strlen(s1),1,stdout);}fclose(fp);return 0;
}
";
fwrite(s1,strlen(s1),1,fp);
if(fwrite)
{
fwrite(s1,strlen(s1),1,stdout);
}
fclose(fp);
return 0;
}
[外链图片转存中...(img-GPl5d72L-1707560962937)]
相关文章:

【Linux】学习-深入了解文件的读与写
深入了解语言级别(C语言)文件操作的"读"与"写" 在学习前,我们先要知道在Linux下的一个原则:一切皆是文件 如何理解呢?举个外设的例子,比如键盘和显示器,这两个外设也可以其实本质上也是文件&…...

java实战:销售订单30分钟未支付自动取消
本文将介绍如何使用Java实现一个销售订单在30分钟内未支付则自动取消的系统。我们将探讨如何使用Spring的定时任务功能来检查订单状态,并在订单未支付的情况下执行取消操作。 一、需求分析 在电商系统中,为了管理库存和避免长时间占用资源,…...

一、西瓜书——绪论
第一章 绪论 1.独立同分布 通常 假设 样本空间 中 全 体样 本 服 从 一 个 未 知 “ 分 布 ” ( d i s t r i b u t i o n ) D , 我们获得的每个样本都是独立地从这个分布上采样获得的, 即 “ 独 立同 分布 ” ( i n d e p e n d e n t a n d i d e n t ic a …...

如何连接ChatGPT?无需科学上网,使用官方GPT教程
随着AI的发展,ChatGPT也越来越强大了。 它可以帮你做你能想到的几乎任何事情,妥妥的生产力工具。 然而,对于许多国内的用户来说,并不能直接使用ChatGPT,不过没关系,我最近发现了一个可以直接免科学上网连…...

qt学习:串口
头文件 #include <QSerialPort> #include <QSerialPortInfo> 模块 QT core gui serialport 编程步骤 配置一个ui界面,五个QComboBox和一个按钮和一个QTextEdit 添加一个成员 private:QSerialPort *serial; 在构造函数中初始化ui端口列表和…...

145. 二叉树的后序遍历
给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[3,2,1]示例 2: 输入:root [] 输出:[]示例 3: 输入:root [1] 输…...

Postgresql 的编译安装与包管理安装, 全发行版 Linux 通用
博客原文 文章目录 实验环境信息编译安装获取安装包环境依赖编译安装安装 contrib 下工具代码 创建用户创建数据目录设置开机自启动启动数据库常用运维操作 apt 安装更新源安装 postgresql开机自启修改配置修改密码 实验环境信息 Ubuntu 20.04Postgre 16.1 编译安装 获取安装…...

【Java EE初阶十】多线程进阶二(CAS等)
1. 关于CAS CAS: 全称Compare and swap,字面意思:”比较并交换“,且比较交换的是寄存器和内存; 一个 CAS 涉及到以下操作: 下面通过语法来进一步进项说明: 下面有一个内存M,和两个寄存器A,B; CAS(M,A,B)&am…...

与AI对话:编写高效Prompt的指南
与AI对话:编写高效Prompt的指南 一、明确目标 引导AI提供特定格式或内容答案的策略一、明确需求二、使用示例三、设置参数四、分步询问五、使用关键词 利用关键词引导AI重点关注核心内容的技巧一、确定关键概念二、使用专业术语三、强调重要性四、避免相关术语的混淆…...

QML用ListView实现带section的GridView
QML自带的GridView只能定义delegate,没有section,类似手机相册带时间分组标签的样式就没法做。最简单的方式就是组合ListViewGridView,或者ListViewFlow,但是嵌套View时,子级View一般是完全展开的,只显示该…...

docker之程序镜像的制作
目录 一、每种资源的预安装(基础) 安装 nginx安装 redis 二、dockerfile文件制作(基础) 打包 redis 镜像 创建镜像制作空间制作dockerfile 打包 nginx 镜像 三、创建组合镜像(方式一) 生成centos容器并…...

Git - 每次 git pull/push 时需要账号和密码解决方案
问题描述 在提交项目代码或者拉取代码的时候,每次 git 都要输入用户名密码,很烦~ 解决方案 让服务器记下来用户名和密码,此时输入一次,以后再 git push /pull 的时候就不用再输账号和密码了 # 配置 git 记录用户名和密码 git c…...

C语言中在main函数之后运行的函数
在 Linux 平台上,atexit 函数同样是一个用于注册终止处理函数的库函数,它是 C 标准库 <stdlib.h> 的一部分。atexit 函数允许你注册一个或多个函数,这些函数会在 main 函数执行结束后,或者在调用 exit 函数时,由…...
pytorch训练指标记录之tensoboard,wandb
详解Tensorboard及使用教程_tensorboard怎么用-CSDN博客文章浏览阅读5.1w次,点赞109次,收藏456次。目录一、什么是Tensorboard二、配置Tensorboard环境要求安装三、Tensorboard的使用使用各种add方法记录数据单条曲线(scalar)多条曲线(scalars)直方图(hi…...

C语言——oj刷题——实现字符串逆序
当我们需要逆序一个字符串的内容时,可以通过C语言编写一个函数来实现。下面将详细介绍如何通过C语言实现这个功能,并附上代码示例。 1、实现原理 要逆序一个字符串的内容,可以使用两个指针来交换字符串中对应位置的字符。具体实现原理如下&am…...

空气质量预测 | Matlab实现基于SVR支持向量机回归的空气质量预测模型
文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 政府机构使用空气质量指数 (AQI) 向公众传达当前空气污染程度或预测空气污染程度。 随着 AQI 的上升,公共卫生风险也会增加。 不同国家有自己的空气质量指数,对应不同国家的空气质量标准。 基于支持向量机(Su…...

Vue中的请求拦截器
目录 1 前言 2 使用方法 2.1 创建拦截器 2.2 引入拦截器 1 前言 我们常常会使用JWT令牌来验证登录,因此很多请求都需要携带JWT令牌,我们当然可以用{headers:{Authorization:xx}}的方式,向每个请求中都以这样的方式添加JWT令牌。不过这样…...

Java奠基】对象数组练习
目录 商品对象信息获取 商品对象信息输入 商品对象信息计算 商品对象信息统计 学生数据管理实现 商品对象信息获取 题目要求是这样的: 定义数组存储3个商品对象。 商品的属性:商品的id,名字,价格,库存。 创建三个…...

排序算法---快速排序
原创不易,转载请注明出处。欢迎点赞收藏~ 快速排序是一种常用的排序算法,采用分治的策略来进行排序。它的基本思想是选取一个元素作为基准(通常是数组中的第一个元素),然后将数组分割成两部分,其中一部分的…...

算法||实现典型数据结构的查找、添加和删除数据 并分析其时间和空间复杂度
实现典型数据结构的查找、添加和删除数据 并分析其时间和空间复杂度 线性结构: 数组:是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据。 查找数据 :随机访问 流程图 /** 查询元素下标…...

【蓝桥杯冲冲冲】Invasion of the Milkweed G
【蓝桥杯冲冲冲】Invasion of the Milkweed G 蓝桥杯备赛 | 洛谷做题打卡day30 文章目录 蓝桥杯备赛 | 洛谷做题打卡day30[USACO09OCT] Invasion of the Milkweed G题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 题解代码我的一些话 [USACO09OCT] Invasion of the Mi…...

【JAVA WEB】 百度热榜实现 新闻页面 Chrome 调试工具
目录 百度热榜 新闻页面 Chrome 调试工具 --查看css属性 打开调试工具的方式 标签页含义 百度热榜 实现效果: 实现代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"vi…...

Linux——动静态库
基础知识:动vs静 类型动静加载时机运行时编译时可复用性多个文件只需要加载一份库文件每个文件都需要加载一份文件性能链接次数越多越有优势链接次数越少越有优势 代码编写 静态库 生成静态库 libmath.a:add.o sub.oar -rc $ $^%.o:%.cgcc -c $<使用静态库 头文件和工…...

Vulnhub靶机:hacksudo-search
一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.15) 靶机:hacksudo-search(10.0.2.50) 目标:获取靶机root权限和flag 靶机下载地址:https://download.vulnhub.co…...

Leetcode 188 买卖股票的最佳时机 IV
题意理解: 给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。 注意…...

win32编程系统BUG(Win32 API中的WM_SETTEXT消息)
由于频繁使用Win32 API中的WM_SETTEXT消息,导致内存占用直线上升。 暂未找到有效解决方案。...

Linux防火墙开放
记录一次问题 写的网络服务无法通信 代码没问题,IP绑定、端口绑定没问题,就是无法进行通信,这里要分2步走。 服务器控制台开放 进入防火墙 添加规则,这里以开放udp的8899端口为例 这里在服务器后台就已经开放了,但此时…...

通过 docker-compose 部署 Flink
概要 通过 docker-compose 以 Session Mode 部署 flink 前置依赖 Docker、docker-composeflink 客户端docker-compose.yml version: "2.2" services:jobmanager:image: flink:1.17.2ports:- "8081:8081"command: jobmanagervolumes:- ${PWD}/checkpoin…...

HarmonyOS ArkTS修改App的默认加载的界面(二十)
前言:在Android开发中想要修改默认启动页,只需要在AndroidManifest.xml中设置即可 只需要在启动的activity种添加如下属性即可 <intent-filter><action android:name"android.intent.action.MAIN" /><category android:name&qu…...

【前端高频面试题--Vue基础篇】
🚀 作者 :“码上有前” 🚀 文章简介 :前端高频面试题 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬前端高频面试题--Vue基础篇 Vue基本原理双向绑定与MVVM模型Vue的优点计算属性与监听属性计算属性监…...