热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【C++】输入输出流(IO流)

文章目录一、C语言的输入输出二、什么是流三、C的IO流1.概览2.标准IO流(1)cin、cout、cerr、clog(2)


文章目录

  • 一、C语言的输入输出
  • 二、什么是流
  • 三、C++的IO流
    • 1.概览
    • 2.标准IO流
      • (1)cin、cout、cerr、clog
      • (2)cin、cout与scanf、printf
      • (3)输入输出重载
      • (4)getline
      • (5)循环输入
    • 2.文件流fstream
      • (1)ifstream、ofstream
      • (2)用法
        • 类似于C语言的用法
        • C++的用法
    • 3.字符串流sstream
      • (1)读
    • (2)写
  • 感谢阅读,如有错误请批评指正




一、C语言的输入输出

C语言中最常用到的输入输出方式就是scanf()与printf()。 scanf()是从标准输入设备(键盘) 读取数据,并将值存放在一个或一些变量中;printf()是将指定的文字/字符串输出到 标准输出设备(屏幕)

C语言借助了相应的缓冲区来进行输入与输出。如下图所示:

在这里插入图片描述

对输入输出缓冲区的理解:


  1. 可以屏蔽掉低级IO的实现,低级IO的实现一般都依赖操作系统内核的实现,如果能够屏蔽这部分的差异,可以很容易写出可移植的程序。
  2. 可以实现“行”读取的行为,对于计算机而言是没有“行”这个概念的,但有了这部分,就可以定义出来“行”的概念,然后解析缓冲区的内容,返回一个“行”。



二、什么是流

“流”即是流动,是物质从一处向另一处流动的过程。具体到这里,是对一种有序、连续、有方向性的数据(其单位可以是bit,byte,packet)的抽象描述。

C++流是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存向外部输出设备(显示器)输出的过程。这种输入输出的过程被形象的比喻为“流”。

它的特性是:有序、连续、具有方向性

为了实现这种流动,C++定义了I/O标准类库,这些每个类都称为流或流类,用以完成某方面的功能,下面将介绍这些流。




三、C++的IO流


1.概览

C++系统实现了一个庞大的类的库,如下图所示。其中ios为基类,其他类都直接或间接派生自ios类。
在这里插入图片描述




2.标准IO流


(1)cin、cout、cerr、clog

C++标准库提供了4个全局流对象cin、cout、cerr、clog。使用cout进行标准输出,即数据从内存流向控制台(显示器);使用cin进行标准输入,即数据通过键盘输入到程序中;使用cerr用来进行标准错误的输出;使用clog进行日志的输出。

从前图可以看出,cout、cerr、clog是ostream类的三个不同的对象,因此这三个对象基本没有区别,只是应用场景不同。

如下图所示都是向显示器输出,本意是希望一般的输出用cout,错误输出用cerr,日志输出用clog,但一般很少用到后两个,全部用cout输出。

运行结果如下:
在这里插入图片描述




(2)cin、cout与scanf、printf

C++提供了cin、cout,C语言提供了scanf、printf,他们都可以进行输入输出,但建议能用cin、cout就优先用这两个,如果遇到格式化输入输出时用scanf、printf(cin、cout同样可以格式化输入输出,但是使用起来比较复杂,不如直接用现成的scanf、printf)。

同时,由于C++在某些方面与C语言有较大差异,有时混用四个输入输出也会出现问题。

比如字符串string在C++中用size值来标记字符串的结尾,而C语言下用’\0’来标示字符串的结尾,这一个差异在输入输出时就可能会产生问题,为此string还特意提供了c_str()来用于C语言下的操作。




(3)输入输出重载

cin和cout可以直接输入和输出内置类型(如int、double等)和部分标准自定义类型(如string等),原因是标准库已经将所有这些类型的输入和输出重载了,直接使用即可。

在这里插入图片描述

对于我们自定义的类型&#xff0c;如果想直接使用cin、cout来输入输出&#xff0c;需要自己重载>>和<<&#xff0c;否则不能直接使用。




&#xff08;4&#xff09;getline

同scanf一样&#xff0c;cin也是以空格和换行为间隔分割数据&#xff0c;所以对于一行有空格的数据&#xff0c;它并不能全部读取&#xff0c;这时就要用到getline&#xff0c;getline以换行为间隔分割数据&#xff0c;如下图所示。

运行结果如下&#xff1a;
在这里插入图片描述




&#xff08;5&#xff09;循环输入

当输入若干行内容时&#xff0c;可以用如下的解决方式。

运行结果如下&#xff1a;
在这里插入图片描述
类似于C语言中&#xff1a;

char buffer[100];
while(scanf("%s", buffer) !&#61; EOF)
{//...
}

可以用Ctrl&#43;C来结束输入&#xff0c;其本质是向该进程发送了信号&#xff0c;具体可见【万字详解Linux系列】进程信号&#xff0c;在Linux下和Windows下都是一样的道理。




2.文件流fstream


&#xff08;1&#xff09;ifstream、ofstream

ifstream如下创建一个对象&#xff0c;name是文件名&#xff0c;mode是操作的方式。

ifstream ifs(name, mode);

mode有如下几种可供选择&#xff1a;

在这里插入图片描述

ifstream对象可调用的成员函数&#xff0c;常用的有get&#xff0c;getline&#xff0c;read&#xff0c;seekg&#xff0c;tellg等。通过函数名即可大致了解其作用。get一次获取文件的一个字符&#xff0c;getline一次获取文件的一行&#xff0c;read从文件中读一段内容&#xff0c;seekg设置文件指针的位置&#xff0c;tellg查找文件指针的位置。




&#xff08;2&#xff09;用法


  1. 定义一个文件流对象&#xff1a;ifstream(只输入用)、ofstream(只输出用)、fstream(既输入又输出用)
  2. 使用文件流对象的成员函数打开一个磁盘文件&#xff0c;使得文件流对象和磁盘文件之间建立联系
  3. 使用提取和插入运算符对文件进行读写操作&#xff0c;或使用成员函数进行读写
  4. 关闭文件



类似于C语言的用法

下面的两段代码分别演示ifstream和ofstream对文件读写&#xff0c;写法类似于C语言中的fread、fwrite这些接口&#xff0c;只不过是变成了面向对象而已。

下面这段代码是用ifstream读文件中的内容。

运行结果如下&#xff1a;
在这里插入图片描述



下面这段代码是用ofstream向文件中写入内容&#xff0c;使用方法基本同ifstream。

运行结果如下&#xff1a;
在这里插入图片描述




C&#43;&#43;的用法

下面是C&#43;&#43;提供的文件流的新用法&#xff0c;文件流也是流&#xff0c;所以他也可以用<<或>>来进行读写&#xff0c;用法如下。

代码如下&#xff1a;

void WriteFile()
{//类似于C语言的用法//ofstream ofs("write.txt");//ofs.put(&#39;h&#39;);//char msg[] &#61; "ello world";//int size &#61; sizeof(msg);//ofs.write(msg, size);//可调可不调&#xff0c;因为ofs出了作用域后析构函数会自动调用//ofs.close();//C&#43;&#43;的新用法ofstream ofs("write.txt");char c &#61; &#39;h&#39;;string str &#61; "ello world";ofs << c << str;
}int main()
{WriteFile();return 0;
}

这样ofstream的对象也可以像cout那样通过流来向文件写入内容。

运行结果如下&#xff1a;
在这里插入图片描述

ifstream使用方法同理&#xff0c;只不过流的方向要反一下&#xff0c;这里不再赘述。




3.字符串流sstream

sstream中包括istringstream、ostringstream 和 stringstream三个流&#xff0c;分别用来进行流的输入、输出和输入输出操作&#xff0c;但使用时一般直接用stringstream比较方便。


&#xff08;1&#xff09;读

代码如下&#xff1a;

#include
#include using namespace std;struct ServerInfo//一个简单的结构体
{string ip;int port;
};int main()
{stringstream ss;//定义一个对象ServerInfo info &#61; { "192.0.0.1",8081 };//初始化ss << info.ip << " " << info.port;//将info的两个成员流入ssstring str &#61; ss.str();//通过成员函数str()拿到ss内存储的字符串cout << str << endl;//打印return 0;
}

运行结果如下&#xff0c;对字符串的处理非常方便。

运行结果如下&#xff1a;
在这里插入图片描述




&#xff08;2&#xff09;写

在前面读的基础上再向新的结构体写入已读入的内容。

代码如下&#xff1a;

#include
#include using namespace std;struct ServerInfo
{string ip;int port;
};int main()
{stringstream ss;ServerInfo info &#61; { "192.0.0.1",8081 };ss << info.ip << " " << info.port;//将s中的内容又写入newInfo中//注意&#xff1a;不同项的内容必须以空格或换行结尾&#xff0c;这是C/C&#43;&#43;都要求的ServerInfo newInfo;ss >> newInfo.ip >> newInfo.port;return 0;
}

运行结果如下&#xff1a;

在这里插入图片描述




感谢阅读&#xff0c;如有错误请批评指正


推荐阅读
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
author-avatar
顺大顺麻麻1009_388
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有