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

lv4 嵌入式开发-3 标准IO的读写

目录

1 标准I/O – 读写流

2 标准I/O – 按字符输入

3 标准I/O – 按字符输出

4 标准I/O – 思考和练习

5 标准I/O – 按行输入

6 标准I/O – 按行输出

7 标准I/O – 思考和练习


1 标准I/O – 读写流

流支持不同的读写方式:

读写一个字符:fgetc()/fputc()一次读/写一个字符

读写一行:fgets()和fputs()一次读/写一行

读写若干个对象:fread()/fwrite() 每次读/写若干个对象,而每个对象具有相同的长度

2 标准I/O – 按字符输入

下列3个函数用来输入一个字符:

 #include  <stdio.h>int  fgetc(FILE *stream); int  getc(FILE *stream);   //宏   int  getchar(void);

成功时返回读取的字符;若到文件末尾或出错时返回EOF(-1),

区别:

getchar()等同于fgetc(stdin),但是只能读取标准输入即键盘内容,不能读文件

getc和fgetc区别是一个是宏一个是函数

注意事项:

  1. -函数返回值是int类型不是char类型,主要是为了扩展返回值的范围。
  2. -stdin 也是FILE *的指针,是系统定义好的,指向的是标准输入(键盘输入)
  3. -打开文件后读取,是从文件开头开始读。读完一个后读写指针会后移。读写注意文件位置!
  4. -调用getchar会阻塞,等待你的键盘输入

标准I/O – fgetc – 示例

#include <stdio.h>#define F_PATH "./1.txt"int main(int argc,char *argv[]){FILE *fp;int rec;fp = fopen(F_PATH,"r");if(fp==NULL){perror("fopen");return 0;}rec = fgetc(fp);   //等同于rec = getc(fp);printf("Get char=%c\n",rec);rec = fgetc(fp);printf("Get char=%c\n",rec);rec = fgetc(fp);printf("Get char=%c\n",rec);}//1.txt 内容abcdef
//结果即是打开后的第一个字符
//结果 a
linux@linux:~/Desktop$ ./a.out 
Get char=a
Get char=b
Get char=c
#include <stdio.h>int main(int argc,char *argv[]){int rec;rec = getchar();printf("Get STD=%c\n",rec);
}//getchar会阻塞,等待键盘输入后再输出
linux@linux:~/Desktop$ ./a.out 
a
Get STD=a
int  ch;
ch = fgetc(stdin);
printf(“%c\n”, ch);FILE  *fp;
int  ch, count = 0;
if ((fp  =  fopen(argv[1], “r”)) == NULL)  { perror(“fopen”);  return  -1;
}
while ((ch  =  fgetc(fp)) != EOF) {  count++; 
}
printf(“total  %d bytes\n”, count);

3 标准I/O – 按字符输出

下列函数用来输出一个字符:

#include  <stdio.h>
int  fputc(int c, FILE *stream);
int  putc(int c, FILE *stream);
int  putchar(int c);

成功时返回写入的字符;出错时返回EOF

putchar(c)等同于fputc(c, stdout) ,标准输出即显示器

标准I/O – fputc – 示例

#include <stdio.h>
#define F_PATH "./1.txt"int main(int argc,char *argv[]){FILE *fp;int rec;int wrc = 'w';   fp = fopen(F_PATH,"r+");   //a+在下一行写入if(fp==NULL){perror("fopen");return 0;}rec = fputc(wrc,fp);if(rec == -1){perror("fputc");fclose(fp);return 0;}putchar(wrc);fclose(fp);}//结果
linux@linux:~/Desktop$ cat 1.txt 
abcdef
linux@linux:~/Desktop$ ./a.out 
linux@linux:~/Desktop$ cat 1.txt 
wbcdef                 //a改成了w
fputc(‘a’, stdout);
putchar(‘\n’);FILE  *fp;
int  ch;
if ((fp  =  fopen(argv[1], “w”)) == NULL)  { perror(“fopen”);  return  -1;
}
for(ch = ‘a’; ch <=‘z’; ch++) {  fputc(ch, fp); 
}

4 标准I/O – 思考和练习

如何利用fgetc / fputc实现文件的复制?

提示:

通过命令行参数传递源文件和目标文件名

通过fgetc返回值判断是否读到文件末尾

#include <stdio.h>int main() {FILE *sourceFile, *destinationFile;char ch;// 打开源文件sourceFile = fopen("source.txt", "r");if (sourceFile == NULL) {printf("无法打开源文件。\n");return 1;}// 创建目标文件destinationFile = fopen("destination.txt", "w");if (destinationFile == NULL) {printf("无法创建目标文件。\n");fclose(sourceFile);return 1;}// 复制文件内容while ((ch = fgetc(sourceFile)) != EOF) {fputc(ch, destinationFile);}// 关闭文件fclose(sourceFile);fclose(destinationFile);printf("文件复制成功。\n");return 0;
}

5 标准I/O – 按行输入

下列函数用来输入一行:

#include  <stdio.h>
char  *gets(char *s);  //默认读取得stdin,键盘内容
char *fgets(char *s, int size, FILE *stream);
  • 成功时返回s,到文件末尾或出错时返回NULL
  • gets不推荐使用,容易造成缓冲区溢出(已经被淘汰)
  • 遇到’\n’或已输入size-1个字符时返回,总是包含’\0’ (如abcd,size=3,实际ab\0;如abcd,size=10,那么补充\n)

标准I/O – fgets – 示例

  #define  N  6char buf[N];fgets(buf, N, stdin);printf(“%s”, buf);

假设键盘输入分别是: abcd<回车>     abcdef<回车>   buf中的内容是?

abcd<回车> 终端显示:abcd\n

abcdef<回车> 终端显示:abcde\0

示例2

#include <stdio.h>#define F_PATH "./1.txt"int main(int argc,char *argv[]){FILE *fp;char *ret;char buff[100];fp = fopen(F_PATH,"r+");if(fp==NULL){perror("fopen");return 0;}ret = fgets(buff,5,fp);if(ret == NULL){perror("fgets");fclose(fp);return 0;}printf("buff=%s\n",buff);fclose(fp);
}//运行
linux@linux:~/Desktop$ cat 1.txt 
wb
linux@linux:~/Desktop$ ./a.out 
buff=wblinux@linux:~/Desktop$ echo abcde > 1.txt 
linux@linux:~/Desktop$ cat 1.txt 
abcde
linux@linux:~/Desktop$ ./a.out 
buff=abcd

6 标准I/O – 按行输出

下列函数用来输出字符串:

#include  <stdio.h>
int  puts(const char *s);
int fputs(const char *s,  FILE *stream);
  • 成功时返回非负整数;出错时返回EOF
  • puts将缓冲区s中的字符串输出到stdout,并追加’\n’,类似printf
  • fputs将缓冲区s中的字符串输出到stream,不追加  ‘\n’

标准I/O – fputs – 示例

  puts(“hello  world”);FILE  *fp;char buf[] = “hello world”;if ((fp  =  fopen(argv[1], “a”)) == NULL)  { perror(“fopen”);  return  -1;}fputs(buf, fp);

示例2

#include <stdio.h>#define F_PATH "./1.txt"int main(int argc,char *argv[]){FILE *fp;int ret;fp = fopen(F_PATH,"r+");if(fp==NULL){perror("fopen");return 0;}puts("hello world");fputs("hello world\n",stdout);printf("hello world\n");ret = fputs("abcdef",fp);if(ret == -1){perror("fputs");}fclose(fp);
}//运行结果
linux@linux:~/Desktop$ ./a.out 
hello world
hello world
hello world
linux@linux:~/Desktop$ cat 1.txt 
abcdeflinux@linux:~/Desktop$ 

注意:输出的字符串中可以包含’\n’,也可以不包含

7 标准I/O – 思考和练习

如何统计一个文本文件包含多少行?

fgetc ?  效率低

fgets ?  如何判断读取了一行?

#include <stdio.h>int main() {FILE *file;char line[256];int lineCount = 0;// 打开文件file = fopen("file.txt", "r");if (file == NULL) {printf("无法打开文件。\n");return 1;}// 统计行数while (fgets(line, sizeof(line), file) != NULL) {if (line[0] != '\n') {  // 判断是否读取了一行非空行printf("读取了一行:%s", line);}lineCount++;}// 关闭文件fclose(file);printf("文件包含 %d 行。\n", lineCount);return 0;
}

需要注意的是,fgets() 函数会保留读取到的换行符('\n')字符,因此在判断是否读取了一行时,需要排除只包含换行符的空行。示例代码中使用 if 语句来进行过滤,只输出非空行。

另外,示例代码中对行缓冲区的大小进行了固定设置为 256 字节,具体根据实际需求和文件内容的最大长度进行适当调整。

相关文章:

lv4 嵌入式开发-3 标准IO的读写

目录 1 标准I/O – 读写流 2 标准I/O – 按字符输入 3 标准I/O – 按字符输出 4 标准I/O – 思考和练习 5 标准I/O – 按行输入 6 标准I/O – 按行输出 7 标准I/O – 思考和练习 1 标准I/O – 读写流 流支持不同的读写方式: 读写一个字符&#xff1a;fgetc()/fputc()一…...

iOS UIDevice设备信息

识别设备和操作系统 //获得共享设备实例 open class var current: UIDevice { get }//识别设备的名称 open var name: String { get } // e.g. "My iPhone"//设备类型 open var model: String { get } // e.g. "iPhone", "iPod touch"//本地化设…...

SLAM ORB-SLAM2(2)编译安装

SLAM ORB-SLAM2(2)编译安装 1. 软件包依赖安装2. 依赖安装2.1. Eigen2.2. Pangolin2.3. OpenCV3. ORB-SLAM23.1. 源码下载3.2. 文件修改3.3. 扩大交换空间3.4. 编译1. 软件包依赖安装 以一个纯净的ubuntu20.04桌面版为例 1.首先设置软件源为清华源 2.安装必要依赖 sudo ap…...

第11节-PhotoShop基础课程-索套工具

文章目录 前言1.索套工具 选中后按Ctrl 可以移动2.加&#xff0c;减&#xff0c;交叉 shift alt 2.多边形索套工具 手动首尾相连 或者双击空地1.单击绘制直线选区2.双击结束绘制3.加&#xff0c;减&#xff0c;交叉4. delete可以删除节点 3.磁性索套工具1.沿着边缘自动吸附2.可…...

Json字符串内容比较-超实用版

背景 之前有类似接口diff对比&#xff0c;数据对比的测试需求&#xff0c;涉及到json格式的数据对比&#xff0c;调研了几个大神们分享的代码&#xff0c;选了一个最符合自己需求的研究了下。 说明 这个对比方法&#xff0c;支持JsonObject和JsonArray类型的数据对比&#x…...

Redis系列之客户端Redisson

概述 官方推荐的客户端&#xff0c;支持Redis单实例、Redis哨兵、Redis Cluster、Redis master-slave等各种部署架构。 GitHub&#xff0c; 功能&#xff1a; 分布式锁 分布式锁 使用Redisson提供的分布式锁的一个最常见场景&#xff0c;应用部署为多个节点&#xff0c;然…...

centos 端口被占用的快速排查方式

问题笔记 centos 端口被占用的快速排查方式 centos 端口被占用的快速排查方式 这里说一个我刚刚遇到的问题&#xff0c;解决步骤用来记录&#xff0c;方便以后自己查询。 nginx配置完index.html测试文件&#xff0c;发现一直显示的404页面。 我跑到服务器上想重启一下nginx …...

Java“牵手”淘宝商品列表数据,关键词搜索淘宝商品数据接口,淘宝API申请指南

淘宝商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取淘宝商品列表和商品详情页面数据&#xff0c;您可以通过开放平台的接口或者直接访问淘宝商城的网页来获取商品详情信息。以下是两种常用方法的介绍&…...

OpenEuler/CentOS如何修改密码策略

密码策略文件&#xff1a; /etc/pam.d/system-auth 找到行&#xff1a; password requisite pam_pwquality.so try_first_pass local_users_only 为保证安全&#xff0c;可以将这一行注释掉&#xff0c;添加一行&#xff0c;最后结果如下&#xff1a; #password …...

# Spring MVC与RESTful API:如何设计高效的Web接口

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

Scrum敏捷模式的优势点、实践经验及适用企业

Scrum敏捷模式是一种灵活、适应性强的开发方法&#xff0c;其核心理念是以短周期、高频率的方式进行项目开发&#xff0c;确保团队能够快速响应变化。 Scrum包含三个角色&#xff1a;产品负责人&#xff08;Product Owner&#xff09;、Scrum Master和开发团队&#xff08;Tea…...

【C++杂货铺】探索stack和queue的底层实现

文章目录 一、stack的介绍和使用1.1 stack的介绍1.2 stack的使用1.2.1 最小栈1.2.2 栈的压入、弹出序列1.2.3 逆波兰表达式求值1.2.4 用栈实现队列 二、queue的介绍和使用2.1 queue的介绍2.2 queue的使用2.2.1 二叉树的层序遍历 三、模拟实现3.1 stack模拟实现3.2 queue模拟实现…...

“系统的UI”——SystemUI

SystemUI的实现 以StatusBar为例&#xff0c;来分析下Android系统具体是如何实现它们的。 相关代码分为两部分&#xff0c;即&#xff1a; Service部分 代码路径&#xff1a;frameworks/base/services/java/com/android/server。 应用部分 代码路径&#xff1a;frameworks…...

类和对象:构造函数,析构函数与拷贝构造函数

1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器…...

谈谈Java的特点和优点以及选择Java的原因

&#xfeff;​ 如果面试官问你&#xff1a;请你说说Java的特点和优点&#xff0c;为什么要选择Java&#xff1f;你该怎么回答&#xff1f; 得分点 Java的特点 Java与C的区别 Java的优点标准回答 Java是一门非常纯粹的面向对象的编程语言&#xff0c;它吸收了C语言的各种优…...

消息队列(MQ)面试

目录 讲一讲MQ 面试官: 在你之前的项目中&#xff0c;你是否使用过消息队列&#xff08;MQ&#xff09;&#xff1f;能详细介绍一下你在项目中如何使用MQ吗&#xff1f; 在用户和用户之间的多对多聊天通信中如何使用&#xff0c;请具体来讲一下。 那你可以讲一下消息的确认…...

无涯教程-JavaScript - COUPNUM函数

描述 COUPNUM函数返回结算日和到期日之间应付的息票数量,四舍五入到最接近的整数。 语法 COUPNUM (settlement, maturity, frequency, [basis])争论 Argument描述Required/OptionalSettlement 证券的结算日期。 证券结算日期是指在发行日期之后将证券交易给买方的日期。 Re…...

上海控安携汽车网络安全新研产品出席AUTOSEMO“恒以致远,共创共赢”主题研讨会

8月31日&#xff0c;AUTOSEMO“恒以致远&#xff0c;共创共赢”主题研讨会在天津成功召开。本次大会由中国汽车工业协会软件分会中国汽车基础软件生态标委会&#xff08;简称&#xff1a;AUTOSEMO&#xff09;与天津市西青区人民政府联合主办。现场汇聚了100余位来自产学研政企…...

小程序引入高德/百度地图坐标系详解

小程序引入高德/百度地图坐标系详解 官网最近更新时间&#xff1a;最后更新时间: 2021年08月17日 高德官网之在原生小程序中使用的常见问题 链接 目前在小程序中使用 高德地图只支持以下功能 &#xff1a;地址描述、POI和实时天气数据 小结&#xff1a;从高德api中获取数…...

英诺森 “供应链智能数据平台”荣获“科技进步奖”

近日&#xff0c;2023年中国物流与采购联合会科学技术奖正式公布&#xff0c;该奖项经国家科技部批准&#xff0c;在国家科学技术奖励工作办公室登记备案&#xff0c;是我国物流行业最具影响力的奖项之一。 英诺森联合客户申报的科技项目“英诺森供应链智能数据平台”&#xf…...

kafka 3.5 主题分区的Follower创建Fetcher线程从Leader拉取数据源码

Kakfa集群有主题&#xff0c;每一个主题下又有很多分区&#xff0c;为了保证防止丢失数据&#xff0c;在分区下分Leader副本和Follower副本&#xff0c;而kafka的某个分区的Leader和Follower数据如何同步呢&#xff1f;下面就是讲解的这个 首先要知道&#xff0c;Follower的数据…...

Golang web 项目中实现自定义 recovery 中间件

为什么需要实现自定义 recovery 中间件&#xff1f; 在 Golang 的 Web 项目中&#xff0c;自定义 recovery 中间件是一种常见的做法&#xff0c;用于捕获并处理应用程序的运行时错误&#xff0c;以避免整个应用程序崩溃并返回对应格式的响应数据。 很多三方 web 框架&#xf…...

Direct3D绘制旋转立方体例程

初始化文件见Direct3D的初始化_direct3dcreate9_寂寂寂寂寂蝶丶的博客-CSDN博客 D3DPractice.cpp #include <windows.h> #include "d3dUtility.h" #include <d3dx9math.h>IDirect3DDevice9* Device NULL; IDirect3DVertexBuffer9* VB NULL; IDirect3…...

ElementUI浅尝辄止31:Tabs 标签页

选项卡组件&#xff1a;分隔内容上有关联但属于不同类别的数据集合。 常见于网站内容信息分类或app内容信息tab分类 1.如何使用&#xff1f; Tabs 组件提供了选项卡功能&#xff0c;默认选中第一个标签页&#xff0c;你也可以通过 value 属性来指定当前选中的标签页。 <temp…...

将 ChatGPT 用于数据科学项目的指南

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 我们都知道 ChatGPT 的受欢迎程度以及人们如何使用它来提高生产力。但是&#xff0c;如果您是新手&#xff0c;则值得注册ChatGPT免费演示并尝试它所能做的一切。您还应该参加我们的 ChatGPT 简介课程&#xff0c;学习…...

06-JVM对象内存回收机制深度剖析

上一篇&#xff1a;05-JVM内存分配机制深度剖析 堆中几乎放着所有的对象实例&#xff0c;对堆垃圾回收前的第一步就是要判断哪些对象已经死亡&#xff08;即不能再被任何途径使用的对象&#xff09;。 1.引用计数法 给对象中添加一个引用计数器&#xff0c;每当有一个地方引…...

[VSCode] 替换掉/去掉空行

VSCode中使用快捷键CtrlH&#xff0c;出现替换功能&#xff0c;在上面的“查找”框中输入正则表达式&#xff1a; ^\s*(?\r?$)\n然后选择右侧的“使用正则表达式”&#xff1b;“替换”框内为空&#xff0c;点击右侧的“全部替换”&#xff0c;即可去除所有空行。 参考 [VS…...

时序分解 | MATLAB实现ICEEMDAN+SE改进的自适应经验模态分解+样本熵重构分量

时序分解 | MATLAB实现ICEEMDANSE改进的自适应经验模态分解样本熵重构分量 目录 时序分解 | MATLAB实现ICEEMDANSE改进的自适应经验模态分解样本熵重构分量效果一览基本介绍程序设计参考资料 效果一览 基本介绍 ICEEMDANSE改进的自适应经验模态分解样本熵重构分量 包括频谱图 避…...

python内网环境安装第三方包【内网搭建开发环境】

文章目录 一、问题二、解决方法三、代码实现一、问题 内网安装第三方包的应用场景,一般是一些需要在没网的环境下进行开发的情况。这些环境一般仅支持本地局域网访问,所以只能在不下载任何第三方包的情况下艰难开发。 二、解决方法 将当前应用依赖的第三方包提前下载到本地…...

7.13 在SpringBoot中 正确使用Validation实现参数效验

文章目录 前言引入Maven依赖一、POST/PUT RequestBody参数校验1.1 Valid或Validated注解配合constraints注解1.2 测试运行 二、GET/DELETE RequestParam参数校验2.1 Validated注解配合constraints注解2.2 测试运行 三、GET 无注解参数校验3.1 Valid或Validated注解配合constrai…...

做外汇看什么网站/9个成功的市场营销案例

瞌睡龙 2013/05/20 18:370x00 相关背景介绍Clickjacking&#xff08;点击劫持&#xff09;是由互联网安全专家罗伯特汉森和耶利米格劳斯曼在2008年首创的。是一种视觉欺骗手段&#xff0c;在web端就是iframe嵌套一个透明不可见的页面&#xff0c;让用户在不知情的情况下&#…...

赤峰网站建设/营销软件网站

◆ 方案背景<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />IWS-ICB解决方案是北京一维天地科技有限公司&#xff08;微软金牌认证合作伙伴&#xff09;在微软SharePoint及Office系列产品基础上实现的企业集成协作工作平台解决方…...

做一个网站的完整教程/产品如何做市场推广

什么是诊断服务&#xff1f; 在还没有诊断服务的时候&#xff0c;如果车辆故障&#xff0c;需要有经验的师傅长时间的摸排查找&#xff0c;费时费力。而车辆的ECU节点有了诊断模块后&#xff0c;就具有了诊断功能&#xff0c;这样车辆如果有了故障&#xff0c;就会自动生成故障…...

wordpress交流插件/易观数据app排行

MySql配置优化MySql对内存的使用MySql内存配置位物理内存的70%左右 大部分情况下使用innodb作为表存储引擎 以下参数配置在my.cnf中 1. innodb的缓冲池配置 innodb_buffer_pool_size一般配置服务器总内存的60~70% 2. innodb log 日志缓存配置innodb_log_buffer_size 这个不宜…...

做网址导航网站/java培训班

Oracle中SEQUENCES的使用 Oracle提供了sequence对象,由系统提供自增长的序列号,通常用于生成数据库数据记录的自增长主键或序号的地方. 下面介绍一下关于sequence 的生成,修改,删除等常用的操作: 1. 创建 Sequence 使用如下命令新建sequence(用户需要有CREATE SEQUENCE 或者…...

免费微网站哪个好用/关键词首页排名优化平台

这是一个能够获取到用户访问信息的PHP类&#xff0c;包括&#xff1a;ip地址、地理信息、操作系统、语言、浏览器和isp等等。获取地理位置和ISP信息是请求的Baidu隐藏接口。/*** 获取访客信息的类&#xff1a;语言、浏览器、操作系统、IP、地理位置、ISP。* 日期&#xff1a;20…...