io学习----->标准io

思维导图:

一.io的作用

io是实现对文件的操作,把运行结果存到文件中,读取文件的数据,方便后期查询。

二.io的概念

io是指系统 和外部设备或用户之间的数据交互

I:input 表示数据从外部设备输入到内存中;

O:output表示数据从内存中输出到外部设备的过程。

三.io的分类

io分为文件io和标准io;

标准io:指程序和用户之间的数据交互,标准io=文件io+缓冲区

文件io:指程序和系统之间的数据交互

四.文件io和标准io的区别

标准io:

  1. 满足ANS的标准,当编译程序后,可以在不同的编译环境下执行
  2. 存在缓冲区,加快访问速度
  3. 可移植性强,可以在不同的编译环境下执行
  4. 属于库函数调用,只可以访问普通文件
  5. 标准io操作文件时需要依赖于流指针(FILE*)

文件io

  1. 满足POIX标准,只可以在unix操作系统中使用
  2. 不存在缓冲区,访问速度慢
  3. 不可移植,系统调用,依赖系统
  4. 属于系统函数调用,可以访问特殊文件(连接文件,设备文件,管道文件)
  5. 文件io操作系统时需要依赖文件描述符

五.标准io函数

        1.流和流指针

  • 流:数据一个一个移入或移出缓冲区的过程,称为字节流

  • 流指针FILE*: 本质FILE是一个结构体的别名,当存储./a.out的运行结果,需要创建一个文件,每常见一个文件则会在用户空间申请一片缓冲区。缓冲区存在一些信息(缓冲区的首地址,缓冲区的结束地址等)存在流指针

  • 注意FILE默认已经存在的,程序员直接使用即可

        2.查看流指针

  • 1.查看数据类型 vi -t 类型 ----》vi -t FILE
  • 2.追代码 ctrl    ] (右中括号)
  • 3.返回 ctrl t 

        3.标准io函数

  • 1.fopen-------->文件操作:打开,读取,写入,关闭。

    r

    以读的方式打开文件,流指针指向文件的起始地址,如果文件存在则打开成功,不存在则打开失败

    r+

    以读写的方式打开文件. ,流指针指向文件的起始地址,如果文件存在则打开成功,不存在则打开失败

    w

    以写的方式打开文件,如果文件不存在则创建文件,如果文件存在则清空文件

    w+

    以读写的方式打开文件,如果文件不存在则创建文件,如果文件存在则清空文件

    a

    以追加的方式打开文件(写入到文件的结尾)如果文件不存在则创建文件,如果文件存在则流指针指向文件的结尾

    a+

    以读写(追加)的方式打开文件(写入到文件的结尾)如果文件不存在则创建文件,如果文件存在则流指针指向文件的结尾

  • 2.strerror\perror---------功能:根据错误码,返回一个错误码对应的信息

streeor只返回错误信息,没有详细信息,perror 返回错误信息的同时会给一个提示语句

perror截图:

        3.fgetc\fputc

fputc:输出的函数,对于文件,就是写入的意思

fgetc:输入的函数,对于文件,读取的意思

        4.fclose

功能:关闭文件

        5.fseek\rewind\ftell

fseek:功能:设置指针的偏移量(设置光标的位置)

 #include <stdio.h>

int fseek(FILE *stream, long offset, int whence);

参数:

stream: 流指针,就是fopen的fp

        offset: 指针的偏移量,

如果offset>0 ,指针向后偏移

如果offset<0 指针向前偏移

offset=0 指针不偏移

        whence:

SEEK_SET 把光标设置在起始位置

SEEK_CUR 把光标设置在当前位置

SEEK_END 把光标设置在结尾位置

rewind:把光标设置在起始位置

        void rewind(FILE *stream);

ftell:获取当前指针到起始地址之间的文件大小

        1.把光标设置在文件的结尾 fseek(fp,0,SEEK_END);

        2.获取文件大小 long size=ftell(fp)

        6.fputs\fgets

fputs:功能:从文件流指针中写入字符串

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

fgets:功能:从文件流指针中读取字符串

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

size: 只可以获取小于size个字符,最多存储size-1

六、练习

  1. 使用标准IO函数,实现文件的拷贝
     #include <head1.h>int main(int argc, const char *argv[]){FILE *fp=fopen("IO.text","r");if(NULL==fp){PRINT_ERROR("fopen");}FILE* fp1=fopen("IO.1text","w");//读取文件,然后写入while(1 ){char ch=(fgetc(fp));if(EOF==ch){break;}fputc(ch,fp1);}fclose(fp); fclose(fp1);                      return 0;}
    

  2. 使用fgets函数,打印一个文件,类似cat

    #include <head1.h>2 int main(int argc, const char *argv[])3 {4     //打开文件5     FILE* fp=fopen("./IO.1text","r");6         if(NULL==fp)7         {8             PRINT_ERROR("fopen");9         }10         11     //读取数据12     while(1)13 {   14     int res=fgetc(fp);15     if(EOF==res)16     {17     //  printf("读取失败");18     //  return -1;19         break;20     }   21     printf("%c",res);22 }   23 /*  int res;24     while((res=fgetc(fp)) != EOF)25     {26         printf("%c",res);27     }   28 */                                                   29     //关闭文件30         if(fclose(fp)==EOF)31             PRINT_ERROR("fopen");32             33     return 0;34 }   
    

  3. 计算文件的行数

#include <head1.h>
int main(int argc, const char *argv[])
{//打开文件FILE* fp=fopen("IO.text","r+");if(NULL==fp){   PRINT_ERROR("fopen error");}int count=0;//循环读取,遇到回车计算行数while(1){   char ch =fgetc(fp);if(ch==EOF){break;}if(ch==10){count++;}}printf("这个文件有%d行\n",count);fclose(fp);return 0;
}

 

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

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

    相关文章

    使用消息队列怎样防止消息重复?

    大家好&#xff0c;我是君哥。 使用消息队列时&#xff0c;我们经常会遇到一个可能对业务产生影响的问题&#xff0c;消息重复。在订单、扣款、对账等对幂等有要求的场景&#xff0c;消息重复的问题必须解决。 那怎样应对重复消息呢&#xff1f;今天来聊一聊这个话题。 1.三…

    005 公网访问 docker rocketmq

    文章目录 创建自定义网络创建NameServer容器创建Broker容器正式开始启动 Nameserver 容器启动 Broker 容器并关联 Nameserverdocker exec -it rmqbroker vi /etc/rocketmq/broker.conf检查 namesrv 解析检查 Broker 注册状态Nameserver 日志Broker 日志检查容器日志手动指定 Br…

    解决Docker Desktop启动后Docker Engine stopped问题

    一、问题描述 当我们更新了Docker Desktop后,在重新打开就显示【Docker Engine stopped(Docker引擎已经停止)】,无法正常使用Docker,如下图所示: 二、问题分析 1、检查电脑主板的CPU是否开启虚拟化; 2、需检查Docker所需的功能是否开启; 3、检查WSL是否匹配; Docker的…

    MongoDB—(一主、一从、一仲裁)副本集搭建

    MongoDB集群介绍&#xff1a; MongoDB 副本集是由多个MongoDB实例组成的集群&#xff0c;其中包含一个主节点&#xff08;Primary&#xff09;和多个从节点&#xff08;Secondary&#xff09;&#xff0c;用于提供数据冗余和高可用性。以下是搭建 MongoDB 副本集的详细步骤&am…

    C++STL---<limits>

    C <limits> 头文件&#xff1a; <limits> 头文件是 C 标准库中用于获取各种数据类型的数值范围、精度等信息的工具。它通过模板类 std::numeric_limits 提供了对基本数据类型&#xff08;如 int、float、double 等&#xff09;的详细属性查询功能。通过 std::nume…

    蓝桥杯自我复习打卡

    总复习&#xff0c;打卡1. 一。排序 1。选段排序 太可恶了&#xff0c;直接全排输出&#xff0c;一个测试点都没过。 AC 首先&#xff0c;这个【l,r】区间一定要包含p,或者q&#xff0c;pq一个都不包含的&#xff0c;[l,r]区间无论怎么变&#xff0c;都对ans没有影响。 其次&…

    Flutter_学习记录_实现列表上拉加载更多的功能

    可以用ScrollController组件来实现这样列表上拉加载更多的功能: 1. 定义变量 在StatefulWidget 的组件内&#xff0c;添加三个属性&#xff1a; // 滚动视图的控制器final ScrollController _scrollController ScrollController();// 是否已显示了上拉加载中bool _isShowM…

    【Linux】【网络】不同子网下的客户端和服务器通信其它方式

    【Linux】【网络】不同子网下的客户端和服务器通信其它方式 那么&#xff0c;在 NAT 环境下&#xff0c;应该如何让内网设备做为服务器&#xff0c;使内网设备被外部连接&#xff1f; 1 多拨 部分运营商&#xff0c;支持在多个设备上&#xff0c;通过 PPPoE 登录同一个宽带账…

    《Python百练成仙》31-40章(不定时更新)

    第卅一章 函数结丹def开紫府 罗酆山的鬼门关吞吐着猩红的变量阴风&#xff0c;每个风眼都涌动着作用域混乱的灵力乱流。叶军手握薛香遗留的丹田玉简&#xff0c;玉简表面浮现出残缺的函数符文&#xff1a; def 凝聚金丹(灵气):道基 灵气 * 0.618print(金丹品质) # 作用域外变…

    六十天前端强化训练之第一天到第七天——综合案例:响应式个人博客项目

    欢迎来到编程星辰海的博客讲解 目录 前言回顾 HTML5与CSS3基础 一、知识讲解 1. 项目架构设计&#xff08;语义化HTML&#xff09; 2. 响应式布局系统&#xff08;Flex Grid&#xff09; 3. 样式优先级与组件化设计 4. 完整响应式工作流 二、核心代码示例 完整HTML结…

    测试的BUG分析

    在了解BUG之前,我们要先了解软件测试的生命周期,因为大多数BUG都是在软件测试的过程中被发现的 软件测试的生命周期 在了解 软件测试的生命周期 之前,我们要先了解 软件的生命周期 ,虽然他们之间只差了两个字,但是差距还是很大的 首先是 软件生命周期 ,这个是站在 软件 的角…

    【洛谷贪心算法题】P1094纪念品分组

    该题运用贪心算法&#xff0c;核心思想是在每次分组时&#xff0c;尽可能让价格较小和较大的纪念品组合在一起&#xff0c;以达到最少分组的目的。 【算法思路】 输入处理&#xff1a;首先读取纪念品的数量n和价格上限w&#xff0c;然后依次读取每件纪念品的价格&#xff0c;…

    [STM32]从零开始的STM32 BSRR、BRR、ODR寄存器讲解

    一、前言 学习STM32一阵子以后&#xff0c;相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED&#xff0c;之前的寄存器只是作为一个引入&#xff0c;并没有深层次的讲解&#xff0c;在教…

    SQL分组问题

    下列为电商公司用户访问时间数据 统计某个用户连续的访问记录&#xff0c;如果时间间隔小于60s&#xff0c;就分为一组 id ts 1001 17523641234 1001 17523641256 1002 17523641278 1001 17523641334 1002 17523641434 1001 17523641534 1001 17523641544 1002 17523…

    3月2日 C++日常习题测试一答案

    C测试题答案与讲解 一、填空题答案及讲解 答案&#xff1a;const 讲解&#xff1a;在 C 中&#xff0c;const关键字用于定义常量&#xff0c;一旦定义&#xff0c;其值不能被修改。例如const int num 10;&#xff0c;这里的num就是一个常量。 答案&#xff1a;3 讲解&…

    2W8000字 LLM架构文章阅读指北

    ❝ 大模型架构专栏已经更新了30多篇文章。完整的专栏内容欢迎订阅&#xff1a; LLM 架构专栏 1、LLM大模型架构专栏|| 从NLP基础谈起 2、 LLM大模型架构专栏|| 自然语言处理&#xff08;NLP&#xff09;之建模 3、 LLM大模型架构之词嵌入&#xff08;Part1&#xff09; 3、 LLM…

    SP导入智能材质球

    智能材质球路径 ...\Adobe Substance 3D Painter\resources\starter_assets\smart-materials 放入之后就会自动刷新

    网络原理----TCP/IP(3)

    核心机制七----延时应答 默认情况下&#xff0c;接收方都是在收到数据报的第一时间&#xff0c;就返回ack&#xff0c;但是可以通过延时返回ack的方式来提高效率&#xff0c;理论上不是100%提高效率&#xff0c;但还是有一定帮助的。 因为如果接收数据的主机⽴刻返回ACK应答,…

    MacBook Pro使用FFmpeg捕获摄像头与麦克风推流音视频

    FFmpeg查看macos系统音视频设备列表 ffmpeg -f avfoundation -list_devices true -i "" 使用摄像头及麦克风同时推送音频及视频流: ffmpeg -f avfoundation -pixel_format yuyv422 -framerate 30 -i "0:1" -c:v libx264 -preset ultrafast -b:v 1000k -…

    部署Joplin私有云服务器postgres版-docker compose

    我曾经使用过一段时间 Joplin&#xff0c;官方版本是收费的&#xff0c;而我更倾向于将数据掌握在自己手中。因此&#xff0c;在多次权衡后&#xff0c;我决定自己搭建 Joplin 服务器并进行尝试。 个人搭建的版本与数据库直连&#xff0c;下面是使用 Docker Compose 配置数据库…