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.mfbz.cn/a/400513.html

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

相关文章

笔试题详解(C语言进阶)

前言 欢迎阅读本篇文章&#xff01;本篇文章通过一个笔试题来加强我们对C语言的理解&#xff0c;希望对你有帮助。后续我会写一个栏目&#xff0c;集合我见到的C语言题目&#xff0c;进行分析讲解。 1、题目一 判断下面程序的输出结果&#xff1a;(下面说的地址4/8字节是因为对…

【GameFramework框架内置模块】2、数据节点(Data Node)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog.csdn.net/q7…

机器学习 day38(有放回抽样、随机森林算法、XGBoost)

有放回抽样 有放回抽样和无放回抽样的区别&#xff1a;有放回可以确保每轮抽取的结果不一定相同&#xff0c;无放回则每轮抽取的结果都相同 在猫狗的例子中&#xff0c;我们使用”有放回抽样“来抽取10个样本&#xff0c;并组合为一个与原始数据集不同的新数据集&#xff0c;虽…

ORM中常用的字段和参数,正反向概念

django表查询测试环境搭建 首先&#xff0c;在此之前我们先来回顾一下之前学习的orm内容 1. django自带一个小型的sqlite3的小型数据库 但是这个数据库的功能非常有限&#xff0c;并且针对日期类型的数据兼容性很差 2. 切换数据库数据(MySQL) 2.1 在django1.x版本中你需要在_…

盲水印、暗水印(Blind Watermark)算法简明教程:算法原理、流程以及基于C/C++ 的代码实现

前言 由于工作需要&#xff0c;最近学习了盲水印相关的知识&#xff0c;本文对学习过程中做一个整理和总结。主要内容包括&#xff1a; 对盲水印相关概念做基本介绍对开源的 python 算法 blind_watermark 进行解析&#xff0c;给出算法流程基于 blind_watermark&#xff0c;给…

qt - 19种精美软件样式

qt - 19种精美软件样式 一、效果演示二、核心程序三、下载链接 一、效果演示 二、核心程序 #include "mainwindow.h"#include <QtAdvancedStylesheet.h> #include <QmlStyleUrlInterceptor.h>#include "ui_mainwindow.h" #include <QDir&g…

提高工作效率,体验ONLYOFFICE办公软件

ONLYOFFICE办公软件 一、前言二、特点完整办公套件协作过程更容易 三、访问地址 一、前言 随着数字化办公的普及&#xff0c;办公软件在我们的工作中扮演着越来越重要的角色。为了提高工作效率&#xff0c;我们需要一个功能强大、易于使用的办公软件。ONLYOFFICE作为一款全功能…

如何通过SQL语句获取表/视图的DDL,表/列/索引的统计信息,查询的执行计划(MySQL)

文章目录 获取对象的定义SQL语句列出库中的表和视图表的DDL语句索引的DDL语句视图的DDL语句物化视图的DDL语句 获取统计信息的SQL语句表级统计信息索引统计信息列级统计信息 获取执行计划的Explain语句ExplainExplain JsonExplain Tree (8.0.16及以上)Explain Analyze (8.0.18及…

Java语言实现五子棋

目录 内容 题目 解题 代码 实现 内容 题目 五子棋 使用二维数组,实现五子棋功能. 1.使用二维数组存储五子棋棋盘 如下图 2.在控制台通过Scanner输入黑白棋坐标(例如:1,2 2,1格式 表示二维数组坐标),使用实心五角星和空心五角星表示黑白棋子. 如下图: 输入后重新输出…

解决方案——文本生成图像DF-GAN配置Oxford-102 Flower 花数据集全流程

目录 一、Oxford-102 Flower简介二、DF-GAN配置Oxford-102 Flower 数据集2.1、下载数据集2.2、配置数据集 三、修改代码四、资源下载 一、Oxford-102 Flower简介 Oxford-102 Flower是牛津工程大学于2008年发布的用于图像分类的花卉数据集&#xff0c;原论文链接&#xff1a;Au…

适配器模式:转换接口,无缝对接不同系统

文章目录 **一、技术背景与应用场景****为什么使用适配器模式&#xff1f;****典型应用场景包括但不限于&#xff1a;** **二、适配器模式定义与结构****三、使用步骤举例****四、优缺点分析****总结** 一、技术背景与应用场景 适配器模式在软件设计中扮演着桥梁角色&#xff…

.zip文件如何在centos7解压

在CentOS 7中解压.zip文件&#xff0c;您可以使用unzip命令。如果您的系统上没有安装unzip工具&#xff0c;您首先需要安装它。以下是步骤指南&#xff1a; 安装unzip工具 打开终端并运行以下命令来安装unzip&#xff1a; sudo yum install unzip解压.zip文件 安装unzip之后&am…

2023年12月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 运行以下程序,输出的结果是?( ) class A():def __init__(self,x):self.x=x

leetcode hot100组合综合四

本题中&#xff0c;是要求nums中求的总和为target的排列数&#xff0c;因为题中说了&#xff0c;元素顺序不同&#xff0c;则可以视为不同的结果之一。 所以&#xff0c;根据对背包问题的总结&#xff0c;本题中元素可以重复使用&#xff0c;是完全背包并且需要求排列数&#…

多线程——threading和queue模块的理解。加实例+详解+思路

并发&#xff1a;假的多任务 并行&#xff1a;真的多任务 实现多线程用——threading模块 import threading import timedef shuru():for i in range(1,4):print("正在输入")time.sleep(1) def shuchu():for i in range(1,4):print("正在输出")time.sle…

通俗易懂的双亲委派机制

当你超过别人一点点&#xff0c;别人会嫉妒你&#xff1b;当你超过别人一大截&#xff0c;别人就会羡慕你 据说给我点关注的都成了大佬&#xff0c;点关注的我都会私发一份好东西 ​​​​你得先知道 在介绍双亲委派机制的时候&#xff0c;不得不提ClassLoader&#xff08;类…

Windows / Linux dir 命令

Windows / Linux dir 命令 1. dir2. dir *.* > data.txt3. dir - list directory contentsReferences 1. dir 显示目录的文件和子目录的列表。 Microsoft Windows [版本 10.0.18363.900] (c) 2019 Microsoft Corporation。保留所有权利。C:\Users\cheng>dir驱动器 C 中…

xxl-job架构原理讲解

1、调度中心 调度中心是一个单独的Web服务&#xff0c;主要是用来触发定时任务的执行 它提供了一些页面操作&#xff0c;我们可以很方便地去管理这些定时任务的触发逻辑 调度中心依赖数据库&#xff0c;所以数据都是存在数据库中的 调度中心也支持集群模式&#xff0c;但是…

mybatis数据操作语句

//基于注解 Mapper public interface reboudapt {Select("select * from dept")List<dept> huoqudept();//删除语句Delete("delete from dept where id #{id}")void deletesc(Integer id);//增加语句Insert("insert into dept(name, create_t…

【flutter】第一个flutter项目

前言 我们通过Android Studio来创建flutter项目。 安装dart和flutter插件 新版编译器需要先安装flutter插件才能构建flutter项目。 项目目录 我们基本就在lib中写代码 项目启动
最新文章