首页 > 编程语言 >C++ 的IO流

C++ 的IO流

时间:2024-12-23 23:32:29浏览次数:6  
标签:输出 cout cin C++ IO operator 输入

C语言的输入与输出

        C语言中我们用到的最频繁的输入输出方式就是 scanf () printf()scanf(): 从标准输入设备 ( ) 读取数据,并将值存放在变量中printf(): 将指定的文字 / 字符串输出到标准输出设备 ( 屏幕 ) 注意宽度输出和精度输出控制。 C 语言借助了相应的缓冲区来进行输入与输出。如下图所示: 对输入输出缓冲区的理解:         1.可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差异,可以很容易写出可移植的程序。         2.可以使用这部分的内容实现“行”读取的行为,对于计算机而言是没有“行”这个概念,有了这部分,就可以定义“行”的概念,然后解析缓冲区的内容,返回一个“行”。

流是什么

        是对 一种有序连续且具有方向性的数据( 其单位可以是bit,byte,packet ) 的抽象描述。 C++流是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存向外部输出设 备(显示器)输出的过程。这种输入输出的过程被形象的比喻为“流”。 它的特性是:有序连续、具有方向性 为了实现这种流动,C++定义了 I/O标准类库,这些 每个类都称为流/流类,用以完成某方面的功能

 

C++IO流

C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios类

C++标准IO流

        C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出(即数据从内存流向控制台(显示器))。使用cin进行标准输入(即数据通过键盘输入到程序中),同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出,cout、 cerr、clog是ostream类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不同。

        在使用时候必须要包含文件并引入std标准命名空间。

注意:

1. cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输 入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。

2. 输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state中对 应位置位(置1),程序继续。

3. 空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输 入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有 空格。回车符也无法读入。

4. cin和cout可以直接输入和输出内置类型数据,原因:标准库已经将所有内置类型的输入和 输出全部重载了:

5. 对于自定义类型,如果要支持cin和cout的标准输入输出,需要对和>>进行重载。

6. 在线OJ中的输入和输出:

对于IO类型的算法,一般都需要循环输入:

输出:严格按照题目的要求进行,多一个少一个空格都不行。连续输入时,vs系列编译器下在输入ctrl+Z时结束

 单个元素循环输入
while(cin>>a)
{
    // ...
}

 多个元素循环输入
while(c>>a>>b>>c)
{
    // ...
}

 整行接收
while(cin>>str)
{
    // ...
}
7. istream 类型对象转换为逻辑条件判断值
istream& operator>> (int& val);
explicit operator bool() const;

实际上我们看到使用 while(cin>>i) 去流中提取对象数据时,调用的是 operator>> ,返回值是 istream 类型的对象,那么这里可以做逻辑条件值,源自于 istream 的对象又调用了 operator bool , operator bool 调用时如果接收流失败,或者有结束标志,则返回 false 。
class Date
{
     friend ostream& operator << (ostream& out, const Date& d);
     friend istream& operator >> (istream& in, Date& d);
public:
     Date(int year = 1, int month = 1, int day = 1)
     :_year(year)
     , _month(month)
     , _day(day)
     {}
     operator bool()
     {
        // 这里是随意写的,假设输入_year为0,则结束
         if (_year == 0)
             return false;
         else
             return true;
     }
private:
     int _year;
     int _month;
     int _day;
};

istream& operator >> (istream& in, Date& d)
{
     in >> d._year >> d._month >> d._day;
     return in;
}
ostream& operator << (ostream& out, const Date& d)
{
     out << d._year << " " << d._month <<" "<< d._day ;
     return out;
}

 C++ IO流,使用面向对象+运算符重载的方式
 能更好的兼容自定义类型,流插入和流提取
int main()
{
     // 自动识别类型的本质--函数重载
     // 内置类型可以直接使用--因为库里面ostream类型已经实现了
     int i = 1;
     double j = 2.2;
     cout << i << endl;
     cout << j << endl;
     // 自定义类型则需要我们自己重载<< 和 >>
     Date d(2022, 4, 10);
     cout << d;
     while (d)
     {
         cin >> d;
         cout << d;
     }
     return 0;
}

标签:输出,cout,cin,C++,IO,operator,输入
From: https://blog.csdn.net/m0_73751295/article/details/144678224

相关文章

  • More Effective C++之技术Techniques,Idioms,Patterns_条款25
    MoreEffectiveC++之技术Techniques,Idioms,Patterns条款25:将constructor和non-memberfunction虚化constructor虚化将Non-MemberFunctions的行为虚化    本章描述C++程序员常常遭遇的一些问题的解决办法,这些解法都已获得证明。本书把这样的解法称为techniques......
  • C++ 面向对象编程:+号运算符重载,左移运算符重载
    像+、-号进行运算符重载,过程类似,见以下代码示例:#include<iostream>#include<string>usingnamespacestd;classnumber1{   friendnumber1operator+(number1&one,number1&two);public:   number1():msg1(0),msg2(1){}   number1(intmsg1,intmsg......
  • 12.23日总结之C++学习笔记-1
    *iter++是一个符合表达式,可分解为*iter和++iter,自增++的优先级要比解引用*的优先级要高,但是后缀自增表示先返回原本的值,再进行自增。也就是说上面的语句和*-i(ter++)是完全一样的。Ai解释“这是一个后缀递增操作符。它会返回当前的iter值,然后将iter增加一个位置。例如,如果......
  • Solution - Luogu P11402 [Code+#8 初赛] 图
    首先通过手玩,发现对于小的\(n\)都有\(m_{\max}\len\),于是直接猜测这个结论并尝试证明。首先对于\(n\le4\)的情况,首先可以直接通过手玩知道\(m_{\max}\len\)。对于\(n>4\)的情况,考虑\(n\)从小到大证明。若\(m>n\),则\(\sum\limits_{i=1}^n\operatorname{de......
  • 解决 高版本SpringBoot整合Swagger 启动报错Failed to start bean ‘documentationPlu
    解决高版本SpringBoot整合Swagger启动报错Failedtostartbean‘documentationPluginsBootstrapper‘问题|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|A......
  • Solution - Luogu P11394 [JOI Open 2019] ウイルス実験
    首先可以根据字符串\(D\),\(\mathcal{O}(2^c|D|)\)(\(c\)为方向数\(4\))求出上下左右分别是否被感染时对应的最长连续段长度,用于后面的check。考虑到答案要求的最小值,于是可以考虑思考什么样的点不会作为最后的最小值的起始点。考虑到如果最先感染了点\(u\),且最终感染了点\(v......
  • 论文阅读:Revisiting Modularity Maximization for Graph Clustering: A Contrastive L
    论文地址:RevisitingModularityMaximizationforGraphClustering:AContrastiveLearningPerspective|Proceedingsofthe30thACMSIGKDDConferenceonKnowledgeDiscoveryandDataMining代码地址:https://github.com/EdisonLeeeee/MAGI摘要图聚类是一项基础......
  • C++中的.inc文件
    在C++中,.inc文件通常是指包含文件(IncludeFile),但它们的使用场景与.h(头文件)略有不同。.inc文件并没有标准的文件扩展名,实际上它是开发人员自定义的一个命名方式。以下是关于.inc文件的详细说明:1.什么是.inc文件?.inc文件一般用于存放代码的某些片段或配置,通常是......
  • C++中预定义宏
    C++中有许多预定义宏,这些宏在程序编译时由编译器自动定义,并可以在代码中使用。预定义宏通常用于调试、条件编译、文件信息、平台特定配置等方面。以下是一些常见的预定义宏及其具体使用方法和示例。1.__FILE__说明:__FILE__是一个字符串宏,表示当前源代码文件的名称(包括路......
  • 鸿蒙项目云捐助第二十二讲云捐助项目物联网IoT鸿蒙端的代码实现
    鸿蒙项目云捐助第二十二讲云捐助项目物联网IoT鸿蒙端的代码实现前面已介绍华为云IoT物联网的云操作和MQTT.fx的模拟器操作。这里通过华为云IoT官方文档实现鸿蒙ArkTS的端侧开发。根据的华为云Iot官方文档地址如下图所示。这里在API参考文档中可以点击“应用侧HTTPS接口参考......