Day 30 标准IO

文章目录

  • 1.什么是标准IO
    • 1.1 概念
    • 1.2 特点
    • 1.3 操作
  • 2.缓存区
  • 3.函数接口
    • 3.1 打开文件fopen
    • 3.2 关闭文件 fclose
    • 3.3 读写文件操作
      • 3.3.1 每次读写一个字符:fgetc()、fputc()
        • 每次读一个字符fgetc()
        • 每次写一个字符fputc()
        • (1)针对文件
        • (2)针对终端
        • feof和ferror
      • 3.3.2 每次一串字符的读写fgets()和fputs()
        • char * fgets(char *s, int size, FILE * stream);
        • int fputs(const char *s, FILE *stream);
        • (1)针对终端
        • (2)针对文件
      • 3.3.3 二进制读写fread()和fwrite()
        • 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,

1.什么是标准IO

1.1 概念

标准IO:在c库中定义的一组专门用于输入输出的函数
在这里插入图片描述

1.2 特点

(1)通过缓冲机制减少系统调用,提高效率
系统调用:内核向上(用户)提供的一组接口
例如:从硬盘读1kb数据每次只能读1b
在这里插入图片描述
若将数据先存入缓存区则可以减少硬件到用户层的调用次数

(2)围绕着流(stream)进行操作,流用FILE*来描述
注意: vi用ctags索引使用:
1)vi -t 查找名称
输入前面序号,回车。
2)继续追踪:
将光标定位到要追踪的内容,ctrl+]
回退:ctrl+t
3)跳转到上次位置:ctrl+o
跳转到下次位置:ctrl+i
(3) 标准IO默认打开三个流,sdtin(标准输入)、stdout(标准输出)、stderr(标准错误)

1.3 操作

打开文件:fopen
关闭文件: fclose
读写操作:fgetc、fputc、fgets、fputs、fread、fwrite
其他:freopen、rewind、fseek

2.缓存区

(1)全缓存:和文件相关的
(2)行缓存:和终端相关
刷新缓存区
条件一:\n(换行)
条件二:程序退出
条件三:fflush(NULL)(强制刷新所有缓存区) fflush(stdout)(刷新输出缓存区)
条件四:缓存区满
(3)不缓存,没有缓存,标准错误。
综上:当我们每次要打印数据时,并不是将数据直接发送给标准输出设备,也就是并直接发送给显示器,而是将要打印的数据先存放到缓存区,当缓冲存数据满时,或者遇到\n,或者程序结束时,或者手动刷新缓存区时,缓冲区才会把数据传输到标准输出设备中,也就是显示器中进行输出。

练习:计算标准输出缓存区大小 KB

方法一:利用循环打印展示
在这里插入图片描述
方法二:利用结构体指针 stdout (流指针FILE*类型)

#include<stdio.h>int main(int argc, char const *argv[])
{printf("buf:"); //不进行输出的话缓存区不会开辟,所以要先加一句打印为了让标准IO开辟输出缓存区。printf("%d\n",stdout->_IO_buf_end - stdout->_IO_buf_base);return 0;
}

得到1024B

3.函数接口

3.1 打开文件fopen

FILE *fopen(const char *path, const char *mode);
功能:打开文件
参数:
path:打开的文件路径
mode:打开的方式
r:只读,当文件不存在时报错,文件流定位到文件开头
r+:可读可写,当文件不存在时报错,文件流定位到文件开头
w:只写,文件不存在创建,存在则清空
w+:可读可写,文件不存在创建,存在则清空
a:追加(在末尾写),文件不存在创建,存在追加,文件流定位到文件末尾
a+:读和追加,文件不存在创建,存在追加,读文件流定位到文件开头,写文件流定位到文件末尾
注:当a+的方式打开文件时,写只能在末尾进行追加,定位操作是无法改变写的位置,但是可以改变读的位置
返回值:
成功:文件流
失败:NULL,并且会设置错误码

3.2 关闭文件 fclose

#include <stdio.h>int main(int argc, char const *argv[])
{FILE *fp;//1.打开文件fp = fopen("test.c", "r");if (NULL == fp){perror("fopen err");//while(1);//标准错误是不缓存,所以会直接显示到终端return -1;}printf("fopen success\n");//2. 关闭文件fclose(fp);return 0;
}

3.3 读写文件操作

3.3.1 每次读写一个字符:fgetc()、fputc()

每次读一个字符fgetc()

int fgetc(FILE * stream);
功能:从文件中读取一个字符,并将当前文件指针位置向后移动一个字符。
参数:stream:文件流
返回值:
成功:读到的字符
失败或读到文件末尾:EOF(-1)

每次写一个字符fputc()

int fputc(int c, FILE *stream);
功能:向文件中写入一个字符, 成功写入后文件指针会自动向后移动一个字节位置。
参数:c:要写的字符
stream:文件流
返回值:成功:写的字符的ASCII
失败:EOF(-1)

(1)针对文件

fgetc(fp)
fputc(‘字符’,fp)(注意修改权限)

(2)针对终端

fgetc(stdin)
fpuc(‘字符’,stdout)

feof和ferror

int feof(FILE * stream);
功能:判断文件有没有到结尾,也就是当前所在位置后面还有没有字符。
返回:如果到达文件末尾,返回非零值。如果后面还有字符则返回0。

int ferror(FILE * stream);
功能:检测文件有没有出错
返回:文件出错,返回非零值。如果没有出错,返回0。

3.3.2 每次一串字符的读写fgets()和fputs()

char * fgets(char *s, int size, FILE * stream);

功能:从文件中每次读取一行字符串

参数:
s:存放字符串的地址
size:一次读取的字符个数
stream:文件流

返回值:
成功:s的地址
失败或读到文件末尾:NULL

特性: 每次实际读取的字符个数为size-1个,会在末尾自动添加\0
每次读一行,遇到\n或者到达文件末尾后不再继续读下一行
并把它存储在s所指向的字符串内。
如果到达末尾则返回NULL,继续输出的还是上一次buf中保留的内容。

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

功能:向文件中写字符串
参数:s:要写的内容
stream:文件流
返回值:成功:非负整数
失败:EOF

(1)针对终端

char buf[32]=“”;
fgets(buf,sizeof(buf),stdin);
printf(“buf:%s\n”,buf);

(2)针对文件

char buf[32]=“”;
fgets(buf,sizeof(buf),fp);

fputs(buf,fp);

3.3.3 二进制读写fread()和fwrite()

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

功能:从文件流读取多个元素(将二进制数据从文件读出)
参数: ptr :是一个指针,是存放数据的存储空间的起始地址,用来存放读取元素
size :元素大小 sizeof(元素数据类型)
nmemb :读取元素的个数
stream :要读取的文件流
返回值:成功:读取的元素的个数
读到文件尾或失败: 0

size_t fwrite(const void *ptr, size_t size, size_t nmemb,
          FILE *stream);

功能:将二进制数据写入文件
参数: ptr :是一个指针,保存要输出数据的空间的地址。
size :要写入的字节数 sizeof(数据类型)
nmemb : 要进行写入元素的个数
stream: 目标文件流指针
返回值:成功:写的元素个数
失败 :-1
文件定位操作:rewind(FILE *fp);

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

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

相关文章

击败.helper勒索病毒:恢复被加密的数据文件的方法

导言: 近年来&#xff0c;勒索病毒成为网络安全领域的一大威胁&#xff0c;其中.helper勒索病毒更是备受关注。该类型的勒索软件以其高效的加密算法&#xff0c;能够将用户的文件加密&#xff0c;迫使用户支付赎金才能解密数据。本文将介绍.helper勒索病毒的特点、恢复被加密数…

集成使用 GitHub Copilot 提升 IDEA 开发效率

集成使用 GitHub Copilot 提升 IDEA 开发效率 在现代软件开发中&#xff0c;集成开发环境&#xff08;IDE&#xff09;如IntelliJ IDEA已经成为开发人员不可或缺的工具。它们提供了代码编辑、调试、版本控制等一系列功能&#xff0c;极大地提高了开发效率。而GitHub Copilot作…

【Docker】Linux主机部署Docker

Docker部署 1.二进制文件部署 到如下地址&#xff0c;下载二进制包。 Docker官网&#xff1a;https://docs.docker.com/engine/install/binaries/ 网易镜像源&#xff1a;https://mirrors.163.com/docker-ce/linux/static/stable/x86_64/ 下载好的二进制包上传到主机&#xf…

Java之获取Nginx代理之后的客户端IP

Java之获取Nginx代理之后的客户端IP Nginx代理接口之后&#xff0c;后台获取的IP地址都是127.0.0.1&#xff0c;解决办法是需要配置Nginx搭配后台获取的方法&#xff0c;获得设备的真实地址。我们想要获取的就是nginx代理日志中的这个IP nginx配置 首先在nginx代理的对应lo…

【笔记】APN 配置参数 bitmask 数据转换(Android KaiOS)

一、参数说明 &#xff08;一&#xff09;APN配置结构对比 平台AndroidKaiOS文件类型xmljson结构每个<apn>标签是一条APN&#xff0c;包含完成的信息层级数组结构&#xff0c;使用JSON格式的数据。最外层是mcc&#xff0c;其次mnc&#xff0c;最后APN用数组形式配置&am…

【漏洞复现-通达OA】通达OA video_file.php 任意文件下载漏洞

一、漏洞简介 通达OA video_file.php文件存在任意文件下载漏洞&#xff0c;攻击者通过漏洞可以读取服务器敏感文件。 二、影响版本 ● 通达OA2011 三、资产测绘 ● hunterapp.name"通达 OA" ● 特征 四、漏洞复现 GET /general/mytable/intel_view/video_file.…

Javaweb之SpringBootWeb案例之切入点表达式的详细解析

3.3 切入点表达式 从AOP的入门程序到现在&#xff0c;我们一直都在使用切入点表达式来描述切入点。下面我们就来详细的介绍一下切入点表达式的具体写法。 切入点表达式&#xff1a; 描述切入点方法的一种表达式 作用&#xff1a;主要用来决定项目中的哪些方法需要加入通知 …

带Alpha通道的TIFF文件在GeoServer发布PNG瓦片失败的问题

我在使用GeoServer发布Tiff切PNG瓦片切不了&#xff0c;但是JPG可以&#xff0c;用QGIS转坐标系之后可以&#xff0c;但是用ArcGIS转坐标系之后不可以&#xff0c;看GeoServer日志发现报错如下&#xff1a; org.geowebcache.GeoWebCacheException: Problem communicating with…

浅谈木材加工企业的电气火灾隐患及电气火灾监控系统的应用

摘要&#xff1a;本文分析了木材加工企业的特点、现状及常见电气火灾隐患&#xff0c;提出了消灭电气火灾隐患的措施。结尾介绍了木材加工企业常用电气设备的选用及电气火灾监控系统在其低压配电系统的应用方案及产品选型。 关键词&#xff1a;木材加工企业&#xff1b;电气火…

redis 异步队列

//produceMessage.ts 模拟生产者 import Redis from ioredis; const redis new Redis(); // 生产者&#xff1a;将消息推送到队列 async function produceMessage(queueName:string, message:string) {try {await redis.rpush(queueName, message);console.log(Produced messa…

19个Web前端交互式3D JavaScript框架和库

JavaScript &#xff08;JS&#xff09; 是一种轻量级的解释&#xff08;或即时编译&#xff09;编程语言&#xff0c;是世界上最流行的编程语言。JavaScript 是一种基于原型的多范式、单线程的动态语言&#xff0c;支持面向对象、命令式和声明式&#xff08;例如函数式编程&am…

从零开始手写mmo游戏从框架到爆炸(十六)— 客户端指定回调路由与登录

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 我们这次来把注册、登录、选择英雄&#xff0c;进入主页-选择地图的功能完善。 在这之前&#xff0c;我们还要解决一个问题&#xff0c;就是服务端往客户端发消息的路由问题…

《基于CEEMDAN-小波包分析的隧道爆破信号去噪方法》论文思路

相比于小波降噪&#xff0c;小波包分析具有更高的频率分辨率&#xff0c;可以进一步消除高频部分存在的噪声余量&#xff0c;提高去噪精度 依据EEMD 分解的取值范围&#xff0c;利用“试错法”得到本次试验中CEEMDAN分解的特征参数为&#xff1a;正负高斯白噪声标准差为0.2&a…

Java Web(六)--XML

介绍 官网&#xff1a;XML 教程 为什么需要&#xff1a; 需求 1 : 两个程序间进行数据通信&#xff1f;需求 2 : 给一台服务器&#xff0c;做一个配置文件&#xff0c;当服务器程序启动时&#xff0c;去读取它应当监听的端口号、还有连接数据库的用户名和密码。spring 中的…

二叉树及其练习题

文章目录 树概念及结构树的概念树的相关概念树的表示形式树的应用 二叉树概念及结构概念两种特殊的二叉树二叉树的性质二叉树的存储二叉树的基本操作二叉树的遍历前中后序遍历递归实现二叉树的基本操作 二叉树相关oj题 树概念及结构 树的概念 树是一种非线性的数据结构&#…

c++:蓝桥杯中的基础算法1(枚举,双指针)

枚举 基础概念&#xff1a; 枚举&#xff08;Enum&#xff09;是一种用户定义的数据类型&#xff0c;用于定义一个有限集合的命名常量。在C中&#xff0c;枚举类型可以通过关键字enum来定义。 下面是一个简单的枚举类型的定义示例&#xff1a; #include <iostream>enum…

【面试题】谈谈MySQL的索引

索引是啥 可以把Mysql的索引看做是一本书的目录&#xff0c;当你需要快速查找某个章节在哪的时候&#xff0c;就可以利用目录&#xff0c;快速的得到某个章节的具体的页码。Mysql的索引就是为了提高查询的速度&#xff0c;但是降低了增删改的操作效率&#xff0c;也提高了空间…

医疗在线问诊小程序:开启数字化医疗新篇章

随着科技的飞速发展&#xff0c;医疗行业正逐步向数字化转型。其中&#xff0c;医疗在线问诊小程序作为一种新型的医疗健康服务模式&#xff0c;为人们提供了更为便捷、高效的医疗咨询服务。本文将探讨医疗在线问诊小程序的发展背景、优势及应用场景&#xff0c;以期为医疗行业…

【HarmonyOS应用开发】三方库(二十)

三方库的基本使用 一、如何获取三方库 目前提供了两种途径获取开源三方库&#xff1a; 通过访问Gitee网站开源社区获取 在Gitee中&#xff0c;搜索OpenHarmony-TPC仓库&#xff0c;在tpc_resource中对三方库进行了资源汇总&#xff0c;可以供开发者参考。 通过OpenHarmony三…

小程序--模板语法

一、插值{{}}语法 1、内容绑定 <view>{{iptValue}}</view> 2、属性绑定 <switch checked"{{true}}" /> Page({data: {iptValue: 123} }) 二、简易双向数据绑定 model:value&#xff1a;支持双向数据绑定 注&#xff1a;仅input和textarea支持&a…