C++输入流和输出流介绍

简介: C++ 又可以称为“带类的 C”,即可以理解为 C++ 是 C 语言的基础上增加了面向对象(类和对象)。在此基础上,学过 C 语言的读者应该知道,它有一整套完成数据读写(I/O)的解决方案:使用 scanf()、gets() 等函数从键盘读取数据,使用 printf()、puts() 等函数向屏幕上输出数据;使用 fscanf()、fgets() 等函数读取文件中的数据,使用 fprintf()、fputs() 等函数向文件中写入数据。要知道,C 语言的这套 I/O 解决方案也适用于 C++ 程序,但 C++ 并没有“偷懒”,它自己独立开发了一套全新的 I/O 解决方案,其中就包含

C++ 又可以称为“带类的 C”,即可以理解为 C++ 是 C 语言的基础上增加了面向对象(类和对象)。在此基础上,学过 C 语言的读者应该知道,它有一整套完成数据读写(I/O)的解决方案:

  • 使用 scanf()、gets() 等函数从键盘读取数据,使用 printf()、puts() 等函数向屏幕上输出数据;
  • 使用 fscanf()、fgets() 等函数读取文件中的数据,使用 fprintf()、fputs() 等函数向文件中写入数据。

要知道,C 语言的这套 I/O 解决方案也适用于 C++ 程序,但 C++ 并没有“偷懒”,它自己独立开发了一套全新的 I/O 解决方案,其中就包含大家一直使用的 cin 和 cout。前面章节中,我们一直在用 cin 接收从键盘输入的数据,用 cout 向屏幕上输出数据(这 2 个过程又统称为“标准 I/O”)。除此之外,C++ 也对从文件中读取数据和向文件中写入数据做了支持(统称为“文件 I/O”)。

本质上来说,C++ 的这套 I/O 解决方案就是一个包含很多类的类库(作为 C++ 标准库的组成部分),这些类常被称为“流类”。

C++ 的开发者认为数据输入和输出的过程也是数据传输的过程,数据像水一样从一个地方流动到另一个地方,所以 C++ 中将此过程称为“流”,实现此过程的类称为“流类”。

C++ 中用于实现数据输入和输出的这些流类以及它们之间的关系:

其中,图中的箭头代表各个类之间的派生关系。比如,ios 是所有流类的基类,它派生出 istream 和 ostream。特别需要指出的是,为了避免多继承的二义性,从 ios 派生出 istream 和 ostream 时,均使用了 virtual 关键字(虚继承)。

这些流类各自的功能分别为:

  • istream:常用于接收从键盘输入的数据;
  • ostream:常用于将数据输出到屏幕上;
  • ifstream:用于读取文件中的数据;
  • ofstream:用于向文件中写入数据;
  • iostream:继承自 istream 和 ostream 类,因为该类的功能兼两者于一身,既能用于输入,也能用于输出;
  • fstream:兼 ifstream 和 ofstream 类功能于一身,既能读取文件中的数据,又能向文件中写入数据。

C++输入流和输出流

在前面章节的学习中,只要涉及输入或者输出数据,我们立马想到的就是 cin 和 cout。其实,cin 就是 istream 类的对象,cout 是 ostream 类的对象,它们都声明在 <iostream> 头文件中,这也解释了“为什么在 C++ 程序中引入 <iostream> 就可以使用 cin 和 cout”(当然使用 cin 和 cout,还需要声明 std 命名空间)。

除此之外,<iostream> 头文件中还声明有 2 个 ostream 类对象,分别为 cerr 和 clog。它们的用法和 cout 完全一样,但 cerr 常用来输出警告和错误信息给程序的使用者,clog 常用来输出程序执行过程中的日志信息(此部分信息只有程序开发者看得到,不需要对普通用户公开)。

cout、cerr 和 clog 之间的区别如下:

  1. cout 除了可以将数据输出到屏幕上,通过重定向(后续会讲),还可以实现将数据输出到指定文件中;而 cerr 和 clog 都不支持重定向,它们只能将数据输出到屏幕上;
  2. cout 和 clog 都设有缓冲区,即它们在输出数据时,会先将要数据放到缓冲区,等缓冲区满或者手动换行(使用换行符 '\n' 或者 endl)时,才会将数据全部显示到屏幕上;而 cerr 则不设缓冲区,它会直接将数据输出到屏幕上。

除了以上 2 点特性上的不同之外,cerr、clog 和 cout 没有任何不同。之所以我们常用 cout,是因为 cerr 和 clog 有各自不同的适用场景。以 cerr 为例,一旦程序某处使用 cerr 输出数据,我们自然而然地会认为此处输出的是警告或者错误信息。

值得一提的是,类似 cin、cout、cerr 和 clog 这样,它们都是 C++ 标准库的开发者创建好的,可以直接拿来使用,这种在 C++ 中提前创建好的对象称为内置对象。实际上,<iostream> 头文件中还声明有处理宽字符的 4 个内置对象,分别为 wcin、wcout、wcerr 以及 wclog,由于不是本节重点,这里不再对它们做详细讲解。

如下程序演示了 cin、cout、cerr 和 clog 的基本用法:

#include <iostream>
    #include <string>
    int main() {
        std::string url;
        std::cin >> url;
        std::cout << "cout:" << url << std::endl;
        std::cerr << "cerr:" << url << std::endl;
        std::clog << "clog:" << url << std::endl;
        return 0;
    }

程序执行结果为:

http://c.biancheng.net
cout:http://c.biancheng.net
cerr:http://c.biancheng.net
clog:http://c.biancheng.net

注意,此程序中并没有考虑 cerr 和 clog 各自特有的含义,这里仅是为了演示 cerr 和 clog 的基础用法,不建议读者这样使用。另外,如果程序中 std 命名空间提前声明,则所有的 std:: 可以省略。

它们的用法远不止此,istream 和 ostream 类提供了很多实用的函数,cin、cout、cerr 和 clog 作为类对象,当然也能调用。

表 1 罗列了 cin 对象常用的一些成员方法以及它们的功能:

表 2 罗列了 cout、cerr 和 clog 对象常用的一些成员方法以及它们的功能:

#include <iostream>
    using namespace std;
    int main() {
        char url[30] = {0};
        //读取一行字符串
        cin.getline(url, 30);
        //输出上一条语句读取字符串的个数
        cout << "读取了 "<<cin.gcount()<<" 个字符" << endl;
        //输出 url 数组存储的字符串
        cout.write(url, 30);
        return 0;
    }

程序执行结果为:

http://c.biancheng.net读取了 23 个字符http://c.biancheng.net

注意,表 1 和表 2 中仅罗列了 istream 和 ostream 类中常用的一些成员方法,关于这些方法的具体用法,后续章节会做详细介绍。

目录
相关文章
|
6月前
|
存储 安全 C语言
C++输入和输出流1
C++输入和输出流1
27 0
|
9月前
|
存储 算法 定位技术
c++游戏制作指南(四):c++实现数据的存储和读取(输入流fstream)
c++游戏制作指南(四):c++实现数据的存储和读取(输入流fstream)
260 0
|
缓存 移动开发 编译器
C++STL开发温习与总结(六): 6.C++语言输入/输出流定义之输入/输出格式控制
C++STL开发温习与总结(六): 6.C++语言输入/输出流定义之输入/输出格式控制
C++STL开发温习与总结(六): 6.C++语言输入/输出流定义之输入/输出格式控制
|
存储 安全 C++
c++学习笔记之输入/输出流
1、wchar_t 区别于char,用于存储unicode字符。而char是单字节,只能存储ascii字符。 2、cin/cout/cerr/clog cerr无缓冲错误流 clog有缓冲错误流
208 0
|
数据安全/隐私保护 iOS开发 C++
【C/C++学院】0826-文件重定向/键盘输入流/屏幕输出流/字符串输入输出/文件读写简单操作/字符文件读写二进制与文本差别/get与getline挖掘数据/二进制与文本差别/随机位置/多线程初级
&lt;p&gt;&lt;/p&gt; &lt;h2&gt; &lt;span style=&quot;font-family:宋体; font-size:16pt&quot;&gt;文件重定向&lt;/span&gt;&lt;span style=&quot;font-family:宋体; font-size:16pt&quot;&gt;&lt;/span&gt; &lt;/h2&gt; &lt;img src=&quot;http://img.blog.csdn.net/20151103141629604&quot; alt=&quot;&quot;&gt;&lt;br&gt;
1941 0
|
C++
C++中利用输入输入流进行一行输入
我们在使用istream类的对象cin进行一行输入的时候 往往遇到N多问题  比如我这样做 char  buf [100]  ; cin>>buf ; cout
720 0
|
1天前
|
编译器 C++
【C++】一文全解四种经典 [ 特殊类 ]的设计
【C++】一文全解四种经典 [ 特殊类 ]的设计
|
2天前
|
编译器 C语言 C++
c++初阶------类和对象(六大默认构造函数的揭破)-3
c++初阶------类和对象(六大默认构造函数的揭破)