C++ IO库

news2025/1/22 15:56:27

IO类

IO对象不能拷贝和赋值

iostream

表示形式的变化:

将100转换成二进制序列 然后格式化输出

x,y共用一块内存 输出的时候用不同的方式解析同一块内存

操作

格式化:内部表示转换为相应字节序列

缓存:要输出的内容放到缓存

编码转换:字符编码转换 utf8变长编码

传输:传输给外设

输入相反

封装特性

输入与输出

非格式化IO:不涉及数据任何形式的变化

格式控制

  • std::ios_base 是 C++ 标准库中定义基本输入输出流的类。
  • showposstd::ios_base 类中的一个标志,表示在输出正数时显示正号。
  • std::cout.setf() 用于设置格式标志,将 showpos 标志设置为 std::cout 的格式掩码中,以启用显示正号的功能。
  • std::cout.width() 是 C++ 标准库中用于设置输出宽度的成员函数。它是 std::ostream 类的成员函数,用于影响后续输出的格式。这个函数接受一个整数参数,指定输出字段的宽度,以确保输出的内容在指定的宽度内。如果输出的内容长度不足 10 个字符,将在左侧用空格进行填充
  • std::cout.fill() 是 C++ 标准库中用于设置填充字符的成员函数。它是 std::ostream 类的成员函数,用于指定在宽度设置时所使用的填充字符。填充字符是用于在输出字段宽度不足时进行填充的字符。
#include<iostream>

int main(){
    char x='1';
    std::cout.setf(std::ios_base::showpos);  //开启正号
    std::cout<<x<<std::endl;  
    int y=static_cast<int>(x);
    std::cout<<y<<std::endl;
    return 0;
}

操纵符

std::setw(int n) 设置字段宽度,影响后续输出的宽度。

std::setprecision(int n) 设置输出流的浮点数精度。

std::setiosflags(std::ios_base::fmtflags flags) 设置一组格式标志。

"格式提取"(format extraction)

通常指的是从输入流中读取特定格式的数据。在C++中,常用的输入操作符(如>>)用于从输入流中提取数据,并根据期望的格式进行解析。

提取C风格字符串越界

解决方法使用setw

最后一个元素是\0

例题

#include<iostream>

int main() {
  
    int i = 10;

    // 循环,从标准输入读取整数
    while (std::cin >> i, !std::cin.eof()) {
        // 检查是否发生了不可恢复的流错误
        if (std::cin.bad()) {
            throw std::runtime_error("cin is corrupted");
        }

        // 检查是否发生了格式错误(例如用户输入的不是整数)
        if (std::cin.fail()) {
            // 清除流的错误标志
            std::cin.clear();
            
            // 忽略输入缓冲区中的剩余字符,直到遇到换行符为止
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

            std::cout << "data format error, please try again" << std::endl;
            
            continue;
        }
        std::cout << i << std::endl;
    }
    return 0;
}

文件流与文件操作

文件流对象

文件流处于打开就无法再次打开(C++规定) 只有打开才能IO

#include <iostream>
#include <fstream>

int main() {
    // 打开名为 "myfile" 的文件,创建一个输入文件流对象 inFile
    std::ifstream inFile("myfile");
    // 声明一个字符串变量 x,用于存储从文件中读取的内容
    std::string x;
    // 从文件中读取一个字符串,并将其存储到变量 x 中
    inFile >> x;
    // 输出 "hello" 到标准输出流(控制台)
    std::cout << "hello\n";
    // 关闭文件流(自动在程序结束时关闭,但显式关闭是一种好的实践)
    inFile.close();

    return 0;
}

检测是否打开的函数(检测流是否与文件关联)

打开文件:构造函数 ,或者open

关闭文件:析构函数 或者close

文件流的打开模式

每种文件流都有缺省打开方式

ate与app区别

ate开始位于文件末尾 但可以移动文件指针改变位置

app不能改变一直在文件末尾

例题

//让客户输入文件名称,如果文件不存在,就让客户重新输入文件名称,
//如果文件存在,就将文件全部内容输出。

#include<iostream>
#include<fstream>
#include <string>

int main(){
//让客户输入文件名称,如果文件不存在,就让客户重新输入文件名称,
//如果文件存在,就将文件全部内容输出。
   std::string fileName;
   std::string fileContent;
   while(std::cin>>fileName,!std::cin.eof()){
       if(std::cin.bad()){
            throw std::runtime_error("cin is corrupted");
       }
       std::ifstream ifs(fileName);
       if(ifs){
           while(std::getline(ifs,fileContent)){
               std::cout<<fileContent<<std::endl;
           }
           if(ifs.bad()){
               throw std::runtime_error("ifs is corrupted");
           }
           ifs.close();
       }
       else{
           ifs.clear();
           ifs.ignore(std::numeric_limits<std::streamsize>::max(),'\n' );
           std::cout<<"file not exist,please try again"<<std::endl;
           continue;
       }
   }
    return 0;
}

内存流(stringstream)

在 C++ 中,内存流是一种特殊的流,它不与文件直接关联,而是与内存缓冲区关联。主要的内存流类是 std::istringstream(用于输入操作)和 std::ostringstream(用于输出操作),它们都是基于 std::iostream 类的。

1. std::istringstream(输入内存流):

2. std::ostringstream(输出内存流):

#include <iostream>
#include <sstream>

int main() {
    // 创建一个输出内存流对象 obj1
    std::ostringstream obj1;
    // 将整数 1234 写入内存流
    obj1 << 1234;
    // 获取内存流中的字符串
    std::string res = obj1.str();
    // 输出字符串结果到标准输出
    std::cout << res << std::endl;  // 输出:1234
    // 创建一个输入内存流对象 obj2
    std::istringstream obj2;
    int x;
    // 试图从内存流中读取整数
    obj2 >> x;
    return 0;
}

1. std::ostringstream::str()

std::ostringstream 中,str() 函数返回内存流中的字符串,即当前流中的内容。它允许你将输出到内存流的数据以字符串的形式获取。

2. std::istringstream::str()

std::istringstream 中,str() 函数返回内存流中的字符串,即当前流中的内容。不过,对于 std::istringstreamstr() 函数返回的是从当前读取位置到流末尾的剩余部分的字符串。

作用:

基于字符串流的拼接优化操作

数据转换

string转换为int

#include<iostream>
#include<sstream>
#include<fstream>
#include <string>

int main(){
    std::string str("12");
    std::stringstream strStream(str);
    int i=0;
    strStream>>i;
    if(strStream.bad()){
        throw std::runtime_error("strStream is corrupted");
    }
    else if(strStream.fail()){
        strStream.clear();
        strStream.ignore(std::numeric_limits<std::streamsize>::max(),'\n' );
        std::cout<<"string format error"<<std::endl;
    }
    else{
        std::cout<<i<<std::endl;
    }
    return 0;
}

int转换为string

#include<iostream>
#include<sstream>
#include<fstream>
#include <string>

int main(){
   int i=100;
   std::stringstream str;
   str<<i<<std::endl;
   if(str.bad()){
       throw std::runtime_error("str is corrupted");
   }
   else{
       std::cout<<str.str()<<std::endl;
   }
    return 0;
}

用于对空格分隔的字符串的切分

#include<iostream>
#include<sstream>
#include<fstream>
#include <string>

int main(){
    std::string src("hello word");
    std::string des;
    std::stringstream str(src);
    while(str>>des){
        std::cout<<des<<std::endl;
    }
    if(str.bad()){
        throw std::runtime_error("str is corrupted");
    }
    return 0;
}

流的状态

badbit

  • badbitstd::ios_base 类的成员之一,用于表示底层流发生了严重错误的标志。

  • badbit 被设置时,表示底层流已经处于无法恢复的错误状态,通常涉及到底层设备或文件的严重故障。

  • 如果 badbit 被设置,流的状态会变为 bad,可以通过调用 std::ios_base::bad() 函数检查。

failbit

  • failbitstd::ios_base 类的成员之一,用于表示流操作失败的标志。

  • failbit 被设置时,表示流的操作没有按照预期执行,可能包括格式错误或类型转换失败等。

  •  如果 failbit 被设置,流的状态会变为 fail,可以通过调用 std::ios_base::fail() 函数检查。

复位流状态

捕获流异常

流的定位

获取流位置

tellg 是 C++ 中输入流(std::istream)的成员函数,用于获取当前读取位置的位置指针(stream position indicator)的位置。它返回一个表示位置的整数类型,通常是 std::streampos

tellp 是 C++ 中输出流(std::ostream)的成员函数,用于获取当前写入位置的位置指针(stream position indicator)的位置。它返回一个表示位置的整数类型,通常是 std::streampos

设置流位置

seekg 是 C++ 中输入流(std::istream)的成员函数,用于设置当前读取位置的位置指针(stream position indicator)。这个函数允许你在输入流中移动位置,以便在需要的时候从不同的位置读取数据。

seekp 是 C++ 中输出流(std::ostream)的成员函数,用于设置当前写入位置的位置指针(stream position indicator)。这个函数允许你在输出流中移动位置,以便在需要的时候从不同的位置写入数据

流的同步

sync 是 C++ 中 std::ostream 的成员函数,用于将缓冲区的内容刷新到关联的输出设备(例如文件)。在 C++ 的输出流中,数据通常首先被写入到缓冲区,然后通过 sync 函数将缓冲区的内容刷新到实际的输出设备。

unitbuf 是一个影响输出流缓冲行为的I/O流操纵符。具体而言,它设置流的 unitbuf 标志,这意味着在每次插入操作之后都会刷新缓冲区。

cout有缓冲区 cerr没有

基于绑定的同步(tie)

tie 是一个用于设置关联(或绑定)两个流的成员函数。这个函数是定义在 <iostream> 头文件中的。

输出流(如 std::cout)和输入流(如 std::cin)通常是独立的,它们各自维护自己的缓冲区。然而,有时候你可能希望确保在读取输入之前或在输出后,缓冲区被刷新,以确保数据的正确同步。这时候,tie 就可以派上用场。

tie 的作用是将一个流与另一个流关联,从而在关联的流执行某些操作时,另一个流的缓冲区会被刷新。通常,tie 绑定的是输入流和输出流。

与C语言标准IO库同步

sync_with_stdio 是一个用于控制 C 标准输入输出库(stdio)的函数,用于设置 C 标准输入输出库的缓冲同步状态。这个函数的原型通常在头文件 <stdio.h> 中声明。

sync_with_stdio 接受一个整数参数 sync,如果 sync 的值为非零(例如,传入 1),则表示启用缓冲同步;如果 sync 的值为零,则表示禁用缓冲同步。缓冲同步是指标准输入(stdin)、标准输出(stdout)、标准错误输出(stderr)的缓冲同步状态

在这个示例中 关闭了同步 输出结果只要是a在c前面就是对的 b不一定

代码

#include<iostream>
#include<fstream>
#include <string>

int main(){
//让客户输入文件名称,如果文件不存在,就让客户重新输入文件名称,
//如果文件存在,就将文件全部内容输出。
   std::string fileName;
   std::string fileContent;
   while(std::cin>>fileName,!std::cin.eof()){
       if(std::cin.bad()){
            throw std::runtime_error("cin is corrupted");
       }
       std::ifstream ifs(fileName);
       if(ifs){
           while(std::getline(ifs,fileContent)){
               std::cout<<fileContent<<std::endl;
           }
           if(ifs.bad()){
               throw std::runtime_error("ifs is corrupted");
           }
           ifs.close();
       }
       else{
           ifs.clear();
           ifs.ignore(std::numeric_limits<std::streamsize>::max(),'\n' );
           std::cout<<"file not exist,please try again"<<std::endl;
           continue;
       }
   }
    return 0;
}

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

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

相关文章

四、Zookeeper节点类型

目录 1、临时节点 2、永久节点 Znode有两种,分别为临时节点和永久节点。 节点的类型在创建时即被确定,并且不能改变。 1、临时节点 临时节点的生命周期依赖于创建它们的会话。一旦会话结束,临时节点将被自动删除,

Sailfish OS 移动操作系统

Jolla 是一家曾经致力于开发智能手机和平板电脑的公司&#xff0c;但是这些产品并没有取得成功。后来 Jolla 将重心转向了基于 Linux 的 Sailfish OS&#xff08;旗鱼&#xff09;&#xff0c;并将其应用于现有设备上。Sailfish OS 是由 Jolla 在 MeeGo 基础上开发的移动操作系…

百度查询界面自定义

文章目录 起因步骤 纯个人纪录 参考以下师傅链接 爱吃猫的鱼儿-浏览器设置夜间模式以及百度搜索结果单列居中 起因 发现百度查询结果都在左边&#xff0c;想着能不能居中&#xff0c;发现已经有前辈写了插件&#xff0c;遂安装使用&#xff0c;看下效果 步骤 安装插件暴力猴…

PTA结构体经典编程题

目录 第一题&#xff1a;计算平均成绩 第二题&#xff1a;平面向量加法 第三题&#xff1a;查找书籍 第四题&#xff1a;通讯录排序 第五题&#xff1a;计算职工工资 第一题&#xff1a;计算平均成绩 思路&#xff1a;看到一个学生的基本信息&#xff0c;所以定义一个结构…

力扣每日一题day24[150. 逆波兰表达式求值]

给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操作数&#xff08;运算对象&#xff09;都可以是一个整数或者另一个表达式。两个…

Unity中Shader指令优化

文章目录 前言解析一下不同运算、条件、函数所需的指令数1、常数基本运算2、变量基本运算3、条件语句、循环 和 函数 前言 上一篇文章中&#xff0c;我们解析了Shader解析后的代码。我们在这篇文章中来看怎么实现Shader指令优化 Unity中Shader指令优化&#xff08;编译后指令…

FL Studio2024水果编曲软件21.2.0中文版本下载更新

FL Studio2024是功能强大的音乐制作解决方案&#xff0c;使用旨在为用户提供一个友好完整的音乐创建环境&#xff0c;让您能够轻松创建、管理、编辑、混合具有专业品质的音乐&#xff0c;一切的一切都集中在一个软件中&#xff0c;只要您想&#xff0c;只要您需要&#xff0c;它…

汇编学习记录

前言 这篇文章是自己在专升本录取~本科开学前学习记录&#xff0c;破解软件的学习在2022年4月 - 2022年5月&#xff0c;汇编学习时间大约为2022年7月 - 2022年9月&#xff0c;我将往期上传的博文整理为一篇文章&#xff0c;作为归纳总结。 以后若继续学习相关领域&#xff0c;此…

vue3项目脚手架如何使用swiper, ‘vue-awesome-swiper‘报错解决(简单示例)

目录 前言 使用方法 效果图 1.下载swiper 2. 写入需要的页面 3.在对应页面引入组件 4.推荐页完整代码 前言 Vue3和Vue2在使用swiper时是有差别的&#xff0c;Vue3引入swiper需要注意Vu3的版本和swiper的版本&#xff0c;如果不匹配通常会报错 如下&#xff1a;当引用版本过…

Presto基础学习--学习笔记

1&#xff0c;Presto背景 2011年&#xff0c;FaceBook的数据仓库存储在少量大型hadoop/hdfs集群&#xff0c;在这之前&#xff0c;FaceBook的科学家和分析师一直靠hive进行数据分析&#xff0c;但hive使用MR作为底层计算框架&#xff0c;是专为批处理设计的&#xff0c;但是随…

Spingboot 之spring-boot-starter-parent与spring-boot-dependencies区分

在创建spring boot工程时&#xff0c;spring-boot-starter-parent 和 spring-boot-dependencies是二选一的关系&#xff0c;在pom中引入其中一个就可以了。 那么什么时候用spring-boot-starter-parent 和 spring-boot-dependencies呢&#xff1f;从字面名称上看&#xff0c;如…

从零开始,探索Spring框架的魅力与实践

Spring 1&#xff0c;介绍1.1 为什么要学?1.2 学什么? 2&#xff0c;Spring相关概念2.1 初识Spring2.1.1 Spring家族2.1.2 了解Spring发展史 2.2 Spring系统架构2.2.1 系统架构图2.2.2 spring主要内容 2.3 Spring核心概念2.3.1 目前项目中的问题2.3.2 IOC、IOC容器、Bean、DI…

美容院管理系统服务预约会员小程序效果如何

美容院在美业场景中需求度较高&#xff0c;尤其女性爱美悦己消费逐年增加&#xff0c;如清洁焕肤、祛皱抗衰、激光脱毛等美容项目都有不少需求者。 互联网深入美业行业多年&#xff0c;传统线下经营模式已经很难满足当今客户消费流程&#xff0c;如品牌寻找、服务预约、到店、…

基于PHP的在线日语学习平台

有需要请加文章底部Q哦 可远程调试 PHP在线日语学习平台 一 介绍 此日语学习平台基于原生PHP开发&#xff0c;数据库mysql。系统角色分为用户和管理员。(附带参考设计文档) 技术栈&#xff1a;phpmysqlphpstudyvscode 二 功能 学生 1 注册/登录/注销 2 个人中心 3 查看课程…

完美解决:wget命令下载时遇到“错误 308:Permanent Redirect。”

目录 1 问题 2 解决方法 1 问题 使用wget命令下载时候遇到&#xff1a; --2023-12-02 20:36:08-- http://mirrors.jenkins.io/war-stable/latest/jenkins.war 正在解析主机 mirrors.jenkins.io (mirrors.jenkins.io)... 20.7.178.24, 2603:1030:408:5::15a 正在连接 mirror…

引用计数 Rc 数据类型

RUST提供了一个名为Rc<T>的类型来支持多重所有权&#xff0c;Rc是Reference counting的缩写。Rc<T>类型实例会在内部维护一个用于记录值引用次数的计数器&#xff0c;从而确定这个值是否仍在使用。如果一个值的引用次数为零&#xff0c;就意味着这个值可以被安全清…

深度学习记录--初识向量化

什么是向量化&#xff1f; 之前计算logistic回归损失函数时&#xff0c;在代码实现时&#xff0c;讨论了for循环&#xff1a;过多的for循环会拖慢计算的速度(尤其当数据量很大时) 因此&#xff0c;为了加快计算&#xff0c;向量化是一种手段 运用python的numpy库&#xff0c…

java学习part26线程安全

136-多线程-同步代码块解决两种线程创建方式的线程安全问题_哔哩哔哩_bilibili 1.安全问题 关键在于某些数据操作 2.解决 2.1同步代码块 相当于给数据操作加了互斥锁 2.1.1在实现runnable接口的方式下 锁对象要求必须是唯一的&#xff0c;因为可以看成是谁占了这个对象&…

软件工程期末复习(1)

学习资料 软件工程知识点总结_嘤桃子的博客-CSDN博客 软件工程学习笔记_软件工程导论第六版张海藩pdf-CSDN博客 【软件工程】软件工程期末试卷习题课讲解&#xff01;&#xff01;_哔哩哔哩_bilibili 【拯救者】软件工程速成(期末考研复试软考)均适用. 支持4K_哔哩哔哩_bil…

树基本概念+前中后序遍历二叉树

&#x1f308;一、树的基本概念 ☀️1.树的定义&#xff1a;树是一种非线性结构&#xff0c;看起来像一棵倒挂的树&#xff0c;根朝上&#xff0c;而叶朝下。 ☀️2.相关术语 1.根节点&#xff1a;图中的A&#xff0c;无前驱结点 2.叶节点&#xff08;终端节点&#xff09;&a…