标准IO(Ubuntu)

  • 标准IO

    • 什么是标准IO

      • 头文件stdio.h

        • 用的最多的两个输入输出函数printf和scanf

          • 针对终端的输入输出函数

      • 数据输入到特定的文件需要的条件

        • 需要知道指定文件的文件名和位置

        • 输入到文件中的内容

      • 指定文件

        • fopen函数

          • FILE *fopen(const char *pathname, const char *mode)

        • 功能描述

          • 打开pathname文件,并将其关联到一个流指针,该指针通过返回值的形式返回值。

            • 通过操作这个返回出来的流指针,就相当于在操作文件本身

          • 文件会以mode的方式打开,mode有以下几种情况

            • r:以只读的形式打开文件,如果文件不存在,就会打开失败,fopen就会返回NULL,文件打开成功后,光标位于文件的最开头(即第一个数据的前面)

              • 补:光标位于文件的最末尾指文件的最后一个字符的后面(及文件的结束符)

            • r+:以读写的形式打开文件,其他和r一样

              • 但是r+打开的文件读写同时存在,并且光标独立管理

            • w:以只写的形式打开文件,若文件不存在,则创建后打开,若文件存在,则清空文件打开(清空操作),文件打开后,光标位于文件的开头

              • 补:w打开文件,也存在失败的可能,即文件打开数量超过系统上线(1024个)

              • 可通过shell指令ulimit -a查看打开文件数量 同理文件打开失败会返回NULL

            • w+:以读写的方式打开文件,其他的和w一样

              • 读写光标独立管理

            • a:以追加的方式打开文件

              • 若文件不存在,则创建文件后打开,若文件存在,则直接打开(无清空操作)

              • 文件打开后光标置于文件末尾

            • a+: 以追加和读的方式打开文件

              • 注:读光标是在文件的开头,写文件是在文件的结尾 两个光标独立管理

          • IO操作与数据库:IO没有办法直接删除某一项数据,只能通过逻辑操作来实现

      • 当不再使用文件时关闭文件

        • int fclose(FILE *stream);

        • 功能描述:传入一个文件的的流指针,关闭该文件

      • 3个特殊文件流指针

        • FILE *stdin:标准输入流

    • 文件的输入输出函数

      • 第一组针对文件的输入和输出函数

        • fprintf();

          • int printf(const char *format, ...);

            • 调用形式: printf("%d helloworld\n",123) 功能描述:printf默认使用stdout标准输出流 printf会将 format 中的内容通过流指针stdout标准输出流,输出到终端上面去

          • int fprintf(FILE *stream, const char *format, ...);

            • 功能描述:fprintf会将format中的内容,通过流指针stream,输出到指定的文件中去 调用形式: fprintf(stream,"%d helloworld",345); 也就是说,当fprintf的第一个参数,写成stdout的话,效果等同于printf

          • int sprintf(char *str, const char *format, ...);

            • 功能描述:将format中内容,写入到 str指向的字符数组里面去,实现一个任意数据类型转换成字符串的效果

        • fscanf();

          • int scanf(const char *format, ...);

            • 功能描述:默认使用流指针 stdin,从stdin所代表的终端中,读取数据,将读取到的数据写入到format中格式占位符所代表的变量中去

          • int fscanf(FILE *stream, const char *format, ...);

            • 功能描述:从流指针 stream所指向的文件中,读取数据,将读取到的数据写入到format中格式占位符所代表的变量中去

              • 注意:使用fscanf吸收文件中的所有内容的时候,如何确定循环次数

              • a:通过fscanf的返回值来确定循环次数

              • fscanf成功返回成功吸收的数据的项数,也就是格式占位符的数量

              • 失败吸收数据或者读取到了文件的末尾,返回 EOF (-1)

              • b:通过函数 feof 来确定是否读取到了文件的末尾

          • int feof(FILE *stream);

            • 功能描述:传入等待判断是否读取到文件末尾的文件流指针,如果该文件已经被读取到了末尾,则返回1,没有读取到末尾,返回0

              • 注意:fscanf使用%c的时候,能够吸收空格和回车

          • 文件内容结束标志

            • res = fscanf(fp,"%s",buf);

              • if(i != res)

                • i:fscanf第二个参数格式占位符的数量

              • if(res == EOF)

              • if(feof(fp) == 1)

          • int sscanf(const char *str, const char *format, ...);

            • 功能描述:从指针str所指向的字符数字/字符串中,读取数据,将读取到的数据写入到format中格式占位符所代表的变量中去。

            • 最终实现了:将字符串类型的数据,转换成任意类型的数据

      • 第二组针对文件的输入输出函数

        • fputc();

          • int fputc(int c, FILE *stream);

          • 功能描述:将参数c输出到stream所指向的文件中

          • 返回值

            • 成功返回写入的字符,以unsigned char 形式返回,失败返回则EOF(-1)

            • fputc('x', stdout)等价于fprintf(stdout,"%c",'x');

        • fgetc();

          • int fgetc(FILE * stream);

          • 功能描述

            • 从stream指向的文件中读取一个字节的数据,并以返回值的形式。返回读取到的数据

            • 返回值

              • 成功读取,以unsigned char 的形式,返回读取到的字符数据,

              • 失败返回 -1

        • 返回值不能用unsigned char 接收

          • 返回值为负一会被强转为255

      • 第三组针对文件的输入输出函数

        • fputs

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

          • 功能描述

            • 将字符串或字符数组S写入到文件中

              • S最后的结束符不会写入文件

          • 参数1

            • 输入到文件中的字符串/字符数组

          • 参数2

            • 指定的被输出的数据文件

          • 返回值

            • 成功:返回写入字符的个数

            • 失败返回EOF

              • 文件末尾

        • fgets

          • char *fgets(char *s, int size, FLIE *stream)

          • 功能描述

            • 从stream指向的文件中,读取最多size - 1个字节的数据,然后将其写入s所指向的字符数组中,所有数据写入完成后,会再次写入一个结束符。

              • 当手动输入字节大小时需预留1个字节的空间用于存放结束符

          • 注意

            • fgets只读取一行内容(回车结束)或‘\0’或文件结束符,或者当读取字节大小达到size - 1就会结束读取

          • 参数1

            • 存放读取到的数据的数组

          • 参数2

            • 存放读取的字节大小,函数内部会自动将size -1 ,即读取size - 1个字节的数据

          • 参数3

            • 从stream指向的文件中读取数据

          • 返回值

            • 成功读取,返回第一个参数(字符串数组名)

            • 失败或文件末尾

              • 返回NULL或EOF

          • 故使用fgets读取文件中内容时需循环读取

            • 循环结束条件

              • char *res = fgets(); if(res == NULL){break;} if(feof(fp) == 1){break;}

      • 第四组针对文件的输入输出函数

        • fwrite

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

          • 功能描述

            • 将nmemb个数据块(每块size大小)写入stream所指文件中,数据块首地址由ptr决定

          • 参数1

            • 想要写入文件中的数据块的首地址

          • 参数2

            • 每个数据块的大小

          • 参数3

            • 数据块的个数

          • 参数4

            • 指向文件的流指针

          • 返回值

            • 成功返回写入数据块的数量

            • 失败返回0或小于nmemb的一个数据

          • 将数据写入文件中使用的是数据流(二进制字节流)

            • 文件流

              • 前面学习的fprintf,fputc,fputs无论什么数据,都会以字符串的形式传入文件

            • 数据流

              • 只有字符或字符串,在文件中是以字符串的形式传入,其余以二进制方式存在

        • fread

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

          • 功能描述

            • 从stream指向的文件中,读取nmemb个数据块,每个数据块size大小,然后将读取到的数据块存入ptr指向的内存中

          • 第一个参数

            • 读取数据的存放空间

          • 第二个参数

            • 一个数据块的字节大小

          • 第三个参数

            • 数据块的数量

          • 第四个参数

            • 传入的文件流指针

          • 返回值

            • 通过if语句对其结束进行判断

            • 成功返回读取数据块的数量,

            • 失败返回0或nmemb的第一个数据

          • 注意

            • fread读取数据块时,可能导致某个数据块出现文件结束符,从而导致fread函数返回0,我们需要做到

              • 数据明确时严格按照数据字节大小进行读取

              • 数据块大小不明确时,1个字节一个字节读取

            • fwrite将数据写入文件中,使用的是数据流,

    • 光标偏移函数

      • fseek

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

        • 将文件的光标位置从whence位置偏移offset个字节

        • 参数一

          • 文件流指针

        • 参数二

          • 光标偏移量,+为从左向右偏移,-为从右向左偏移

        • 参数三

          • 偏移起始位置

            • SEEK_SE

              • 文件开头

            • SEEK_CUR

              • 文件当前位置

            • SEEK_END

              • 文件末尾(结束符脸上)

        • fseek读写光标是一起偏移的,不做区分

    • 标准IO缓存区

      • printf换区验证

        • printf(“hello”); while(1);

        • 上述代码运行之后,发现终端并未出现“hello” 说明其没有写入终端文件,而是进入printf缓存区

        • 缓存区刷新时缓存区的内容进入终端

        • 缓存区刷新条件

          • 遇到回车('\n')

          • 缓存区满刷新

            • while(1){ printf("hello world") usleep(8000); }

              • usleep

                • 休眠(us)

              • sleep

                • 休眠(s)

          • 程序结束

          • IO切换

            • 输入输出切换

              • stdout函数

                • getchar()

                • get

              • stdin函数

          • 文件关闭刷新

            • fclose

          • 调用函数fflush(传入流指针),手动刷新

            • fflush(stdin);

        • scanf缓存区

          • 当缓存区存在数据时,会读取数据,将数据取走

          • 若数据不能读取,则会重复读取

      • 标准IO中的缓存区分类

        • 行缓存

          • 1024字节

          • printf向终端输出的数据就是行缓存

          • 对应stdou函数

        • 全缓存

          • 4096字节

          • fprintf,fputc,fputs,fwrite这些向外部文件输入内容的用的都是全缓存

          • 刷新条件比行缓存少一个‘\n’

        • 无缓存

          • perror使用标准错误流向终端输出错误信息用的是无缓存,没有刷新规则

        • 标准IO的所有函数都在流指针所指向的内存空间里

      • 计算缓存区大小

        • 直接让 文件流指针._IO_buf_end - 文件流针._IO_buf_base

        • 注意:使用这种方法计算缓存区的话 一定提前激活一下缓存区(调用函数)

 作业

 #include <myhead.h>                                      
 int main(int argc, const char *argv[])
 {
     printf("__-__-__-__");
     int i = 1;
     do
     {
         fflush(stdout);
         sleep(1);
         for(int i = 0; i < 11; i++)
         {
             printf("\b");
         }
         switch(i)
         {
         case 1:printf("1_-__-__-__");break;
         case 2:printf("12-__-__-__");break;
         case 3:printf("12-3_-__-__");break;
         case 4:printf("12-34-__-__");break;
         case 5:printf("12-34-5_-__");break;
         case 6:printf("12-34-56-__");break;
         case 7:printf("12-34-56-7_");break;
         case 8:printf("12-34-56-78");break;
         }
         i++;
     }while(i != 9);
 
 
     return 0;
 }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pnpm install安装失败

ERR_PNPM_META_FETCH_FAIL GET https://registry.npmjs.org/commitlint%2Fcli: request to https://registry.npmjs.org/commitlint%2Fcli failed, reason: connect ETIMEDOUT 2606:4700::6810:123:443 1. 检查网络连接 确保你的网络连接正常并且没有被防火墙或代理服务器阻止…

Linux shell编程学习笔记64:vmstat命令 获取进程、内存、虚拟内存、IO、cpu等信息

0 前言 在系统安全检查中&#xff0c;通常要收集进程、内存、IO等信息。Linux提供了功能众多的命令来获取这些信息。今天我们先研究vmstat命令。 1.vmstat命令的功能、用法、选项说明和注意事项 1.1 vmstat命令的功能 vmstat是 Virtual Meomory Statistics&#xff08;虚拟内…

【Java数据结构】初始线性表之一:链表

为什么要有链表 上一节我们描述了顺序表&#xff1a;【Java数据结构】初识线性表之一&#xff1a;顺序表-CSDN博客 并且进行了简单模拟实现。通过源码知道&#xff0c;ArrayList底层使用数组来存储元素。 由于其底层是一段连续空间&#xff0c;当在ArrayList任意位置插入或者…

NGFW和防火墙的区别?

NGFW&#xff08;Next Generation Firewall&#xff0c;下一代防火墙&#xff09;和FW&#xff08;Firewall&#xff0c;防火墙&#xff09;在网络安全领域都扮演着重要角色&#xff0c;但它们在功能、性能和应用场景上存在显著的区别。以下是NGFW和FW之间的主要区别&#xff1…

数据库作业九

1、安装redis&#xff0c;启动客户端、验证。 2、string类型数据的命令操作&#xff1a; &#xff08;1&#xff09; 设置键值&#xff1a; &#xff08;2&#xff09; 读取键值&#xff1a; ​ &#xff08;3&#xff09; 数值类型自增1&#xff1a; ​ &#xff08;4&am…

NFT项目的第三方功能及接口

NFT项目涉及到第三方功能及接口的情况非常常见&#xff0c;因为NFT项目本身的功能通常是有限的&#xff0c;需要通过与第三方功能和接口的整合来实现更丰富的功能和更好的用户体验。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 以下…

【LeetCode】十六、并查集

文章目录 1、并查集Union Find2、并查集find的优化&#xff1a;路径压缩 Quick find3、并查集union的优化&#xff1a;权重标记4、leetcode200&#xff1a;岛屿数量解法一&#xff1a;DFS 1、并查集Union Find 并查集&#xff0c;一种树形的数据结构&#xff0c;处理不相交的两…

如何在excel表中实现单元格满足条件时整行变色?

可以试试使用条件格式&#xff1a; 一、条件格式 所谓“自动变色”就要使用条件格式。 先简单模拟数据如下&#xff0c; 按 B列数字为偶数 为条件&#xff0c;整行标记为蓝色背景色。 可以这样设置&#xff1a; 先选中1:10行数据&#xff0c;在这里要确定一下名称栏里显示…

DNS查询过程

DNS&#xff08;域名系统&#xff0c;Domain Name System&#xff09;是一个用于将域名和IP地址相互映射的系统。当你在浏览器中输入一个网址时&#xff0c;浏览器会通过DNS查询过程来找到对应的IP地址&#xff0c;以便能够连接到目标服务器。其查询过程一般通过以下步骤&#…

Apple Vision Pro 和其商业未来

机器人、人工智能相关领域 news/events &#xff08;专栏目录&#xff09; 本文目录 一、Vision Pro 生态系统二、Apple Vision Pro 的营销用例 随着苹果公司备受期待的进军可穿戴计算领域&#xff0c;新款 Apple Vision Pro 承载着巨大的期望。 苹果公司推出的 Vision Pro 售…

MySQL数据库慢查询日志、SQL分析、数据库诊断

1 数据库调优维度 业务需求&#xff1a;勇敢地对不合理的需求说不系统架构&#xff1a;做架构设计的时候&#xff0c;应充分考虑业务的实际情况&#xff0c;考虑好数据库的各种选择(读写分离?高可用?实例个数?分库分表?用什么数据库?)SQL及索引&#xff1a;根据需求编写良…

Qt窗口程序整理汇总

到今日为止&#xff0c;通过一个个案例的实验&#xff0c;逐步熟悉了 Qt6下 窗体界面开发的&#xff0c;将走过的路&#xff0c;再次汇总整理。 Qt Splash样式的登录窗https://blog.csdn.net/castlooo/article/details/140462768 Qt实现MDI应用程序https://blog.csdn.net/cast…

数据库课设---学生宿舍管理系统(sql server+C#)

1.引言 1.1 内容及要求 设计内容&#xff1a;设计学生宿舍管理系统。 设计要求&#xff1a; &#xff08;1&#xff09;数据库应用系统开发的需求分析&#xff0c;写出比较完善系统功能。 &#xff08;2&#xff09;数据库概念模型设计、逻辑模型设计以及物理模型设计。 …

【数学建模】——多领域资源优化中的创新应用-六大经典问题解答

目录 题目1&#xff1a;截取条材 题目 1.1问题描述 1.2 数学模型 1.3 求解 1.4 解答 题目2&#xff1a;商店进货销售计划 题目 2.1 问题描述 2.2 数学模型 2.3 求解 2.4 解答 题目3&#xff1a;货船装载问题 题目 3.1问题重述 3.2 数学模型 3.3 求解 3.4 解…

JS爬虫实战之极验四代

极验四代滑块验证码 一、目标网站说明二、流程步骤1. 逆向步骤一般分为&#xff1a;2. 接口确认1- 确认流程2- 获取verify的参数3- 构建requests验证verify的参数4- 锁定secode参数的作用 ok&#xff0c;让我们去获取verify接口中的响应&#xff01;&#xff01;&#xff01; 3…

el-table表格操作列错行处理

解决方法&#xff1a; <style>::v-deep .el-table th.el-table__cell > .cell {white-space: nowrap !important;} </style>

【C++航海王:追寻罗杰的编程之路】智能指针

目录 1 -> 为什么需要智能指针&#xff1f; 2 -> 内存泄漏 2.1 ->什么是内存泄漏&#xff0c;以及内存泄漏的危害 2.2 -> 内存泄漏分类 2.3 -> 如何避免内存泄漏 3 -> 智能指针的使用及原理 3.1 -> RAII 3.2 -> 智能指针的原理 3.3 -> std…

Kafka Producer发送消息流程之Sender发送线程和在途请求缓存区

文章目录 1. Sender发送数据1. 发送数据的详细过程&#xff1a;2. 关键参数配置 2. 在途请求缓存区 1. Sender发送数据 Sender线程负责将已经在RecordAccumulator中准备好的消息批次发送到Kafka集群。虽然消息在RecordAccumulator中是按照分区组织的&#xff0c;但Sender线程在…

【C++】类和对象的基本概念与使用

本文通过面向对象的概念以及通俗易懂的例子介绍面向对象引出类和对象。最后通过与之有相似之处的C语言中的struct一步步引出C中的类的定义方式&#xff0c;并提出了一些注意事项&#xff0c;最后描述了类的大小的计算方法。 一、什么是面向对象&#xff1f; 1.面向对象的概念 …

基于python的图像去水印

1 代码 import cv2 import numpy as npdef remove_watermark(image_path, output_path):# 读取图片image cv2.imread(image_path)# 转换为灰度图gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用中值滤波去除噪声median_filtered cv2.medianBlur(gray, 5)# 计算图像的梯…