C++输入流和输出流 超级详细

目录
  • 1、简单介绍
  • 2、C++输入流和输出流

1、简单介绍

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++ 中用于实现数据输入和输出的这些流类以及它们之间的关系:

C++类库中的流类:

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

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

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

本章仅讲解实现标准 I/O 操作的 istreamostream iostream 类,有关实现文件 I/O 操作的流类放到后续章节讲解。

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

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

如下程序演示了 cincoutcerr 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 类提供了很多实用的函数,cincoutcerr clog 作为类对象,当然也能调用。

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

表 1 C++ cin 输入流对象常用成员方法

成员方法名 功能
getline(str,n,ch) 从输入流中接收 n-1 个字符给 str 变量,当遇到指定 ch 字符时会停止读取,默认情况下 ch 为 '\0'。
get() 从输入流中读取一个字符,同时该字符会从输入流中消失。
gcount()  返回上次从输入流提取出的字符个数,该函数常和 get()、getline()、ignore()、peek()、read()、readsome()、putback() 和 unget() 联用。
peek() 返回输入流中的第一个字符,但并不是提取该字符。
putback(c)  将字符 c 置入输入流(缓冲区)。
ignore(n,ch) 从输入流中逐个提取字符,但提取出的字符被忽略,不被使用,直至提取出 n 个字符,或者当前读取的字符为 ch。
operator>> 重载 >> 运算符,用于读取指定类型的数据,并返回输入流对象本身。

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

 表 2 C++ cout 输出流对象常用成员方法

成员方法名 功能
put() 输出单个字符。
write() 输出指定的字符串。
tellp() 用于获取当前输出流指针的位置。
seekp() 设置输出流指针的位置。
flush() 刷新输出流缓冲区。
operator<< 重载 << 运算符,使其用于输出其后指定类型的数据。

举个例子:

#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 类中常用的一些成员方法,关于这些方法的具体用法,后续章节会做详细介绍。

到此这篇关于C++输入流和输出流 超级详细的文章就介绍到这了,更多相关C++输入流和输出流内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++编程中用put输出单个字符和cin输入流的用法

    用C++流成员函数put输出单个字符 在程序中一般用cout和插入运算符"<<"实现输出,cout流在内存中有相应的缓冲区.有时用户还有特殊的输出要求,例如只输出一个字符.ostream类除了提供上面介绍过的用于格式控制的成员函数外,还提供了专用于输出单个字符的成员函数put.如: cout.put('a'); 调用该函数的结果是在屏幕上显示一个字符a.put函数的参数可以是字符或字符的ASCII代码(也可以是一个整型表达式).如 cout.put(65 + 32); 也显

  • C++中输入输出流及文件流操作总结

    本文实例为大家分享了C++中输入输出流及文件流操作笔记,供大家参考,具体内容如下 1.流的控制 iomanip          在使用格式化I/O时应包含此头文件.     stdiostream   用于混合使用C和C + +的I/O机制时,例如想将C程序转变为C++程序 2.类继承关系 ios是抽象基类,由它派生出istream类和ostream类, iostream类支持输入输出操作,iostream类是从istream类和ostream类通过多重继承而派生的类 类ifstream继承了

  • c++标准输入输出流关系的前世今生

    输入输出是每一种编程语言必不可少的部分,c++也不例外,下面我们就来说明c++的标准输入输出的前世今生. 1.首先说一下iostream和iostream.h的区别 #include<iostream> // 这个就是1998年标准化以后的标准头文件,使用时需要使用声明命名空间std #include<iostream.h> // 这个就是标准化以前的头文件,里面的函数以及类都是全局的 iostream是现在C++中规定的标准,目的在于使C++代码用于移植和混合嵌入时不受扩展名.h

  • C++ com编程学习详解

    目录 COM简介 COM 规范 首先创建一个ATL工程,创建后你会看到一个idl文件 COM 原理学习 ActiveX 总结 COM简介 COM全程为component object model ,是一个二进制标准可以用于跨语言调用dll模块或者实现组件化以及复用.com不仅可以用在单个操作系统也可以用在跨服务上,在很多大型软件如wps,office你都会看到它的身影. 比如java中调用规范如下: JAVA COM编程 你可能会在电脑出现缺少dll情况,一种修复方式下载dll然后调用regsv

  • C++输入流和输出流 超级详细

    目录 1.简单介绍 2.C++输入流和输出流 1.简单介绍 C++ 又可以称为"带类的 C",即可以理解为 C++ 是 C 语言的基础上增加了面向对象(类和对象).在此基础上,学过 C 语言的读者应该知道,它有一整套完成数据读写(I/O)的解决方案: 使用 scanf() .gets() 等函数从键盘读取数据,使用 printf() .puts() 等函数向屏幕上输出数据: 使用 fscanf() .fgets() 等函数读取文件中的数据,使用 fprintf() .fputs() 等

  • java管道piped输入流与输出流应用场景案例分析

    目录 前言 原理简介 使用场景概述 实际应用 案例一:EXCEL文件导出功能 案例二:XML文件数据传输 结语 前言 PipedInputStream 和 PipedOutputStream 设计用来解决跨线程的字节数据传输.它们总是成对出现的,而在使用上,也只能 工作在两个不同的线程上,在一个线程里使用管道输入和输出流可能会造成死锁.网上有很多介绍这两个存在于 io 包下的 api.却几乎 找不到一个写 PipedInputStream 的使用场景的,所以本文结合实际业务,来聊一聊 Piped

  • Android中文件读写(输入流和输出流)操作小结

    1. Android中文件读写的原理: (1).所有文件的储存都是字节的储存. (2).在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘. (3).在读取文件(特别是文本文件)时,也是一个字节一个字节的读取以形成字节序列. 2. 字节流和字符流的区别: (1).字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,字符流就可以. (2).字节流转换成字符流可以用InputStreamReader,OutputStreamWriter. 一般我们在

  • 一份超级详细的Vue-cli3.0使用教程【推荐】

    主要内容: 零配置启动/打包一个 .vue 文件 详细的搭建过程 重点推荐:使用图形化界面创建/管理/运行项目 安装: 卸载旧版本: 如果你事先已经全局安装了旧版本的 vue-cli (1.x 或 2.x),你需要先卸载它: npm uninstall vue-cli -g Node版本要求: 3.x需要在 Node.js 8.9或更高版本(推荐8.11.0+),点击这里可以安装node 大多数人都安装过了node,使用下面的命令行 查询你的node版本 : node -v 如果你的版本不够,可

  • 基于logback 实现springboot超级详细的日志配置

    前言 java web 下有好几种日志框架,比如:logback,log4j,log4j2(slj4f 并不是一种日志框架,它相当于定义了规范,实现了这个规范的日志框架就能够用 slj4f 调用).其中性能最高的应该使 logback 了,而且 springboot 默认使用的也是 logback 日志,所以本篇将会详细的讲解 logback 的日志配置方案. 本篇主要内容如下: •logback 配置文件的构成 •如何将日志输出到文件 •如何按时间,按大小切分日志 •如何将让一个日志文件中只有

  • python中pygame安装过程(超级详细)

    安装时是需要设置python环境变量的,下载python的时候底下有个小框框(没有默认选中) Add Python 3.7 to PATH需要选择的,如果没有选择的话,需要自己设置,我一般比较懒,卸载了python重新下载的,让下载器自动设置. 然后是python版本问题 有人疑问这是64位还是32位,看那个[64bit]是64位,至于后面的on32是在windows上使用的意思,在Linux上使用就显示别的了. 然后检查pip的安装 如果显示No module named -pip 那么就是p

  • Android Studio下载、安装和配置+SDK+tools下载(无敌超级详细版本)

    下载: Anderson Studio是Google为Android提供的官方IDE工具,下载地址:http://www.android-studio.org/ 下载3.4.1.0版本地址:ctrl+f 查找3.4.1.0 直接下载3.4.1.0的下载地址:https://dl.google.com/dl/android/studio/install/3.4.1.0/android-studio-ide-183.5522156-windows.exe 安装环境要求 : 其中JDK的最低版本是1.

  • 超级详细实用的pycharm常用快捷键

    1.注释(添加/消除)(Ctrl + /) 这里说下Python的单行注释是 # , 多行注释是 '''注释内容''' ,  java的单行注释是 // , 多行注释 /* 注释内容 */,  文档注释 /** 注释内容 */ 这里说的注释快捷键主要用于多行注释, 当你想把一段代码暂时注释掉的时候, 可以直接选中这段代码, 利用此快捷键, 想恢复的时候用同样的操作即可. 2.代码右移/左移(Tab / Shift + Tab) Python中对代码的缩进非常严格, 会直接导致语法错误, 正常的缩

  • idea构建web项目的超级详细教程

    目录 1.idea构建web项目 1.新建一个空项目 2.新建java模块,名为webDemo1 3.选择webDemo1右键,选择Add Framework Support 4.在WEB-INF下新建文件夹classes和lib 5.打开项目结构(Project Structure) 6.项目配置 7.模块配置 8.Facets配置,这里制定了web目录不是一个普通的文件夹,而是web项目 9. 配置Artifacts 10. 添加Tomcat 11.配置Deployment. 12.添加项目

  • 单口NAT的超级详细通俗的解释

    前些天,在网上看到些关于单口nat的配置,发现此配置全部出于一人之手,而且注释的很不明白,cisco官方站上也没有说的很明白,我现在给大家详细解释一下他的原理! 以下对照此帖讲解,可能不太方便,见谅! 首先,什么是单口nat,各位,不知道你们遇到过这种情况没有,就是有一条adsl线路,但是每台机器只有一块网卡,想实现所有机器共享上网,你们说怎么办呢?^_^,可以花5块钱再买块网卡,这当然简单了,但是我们做技术的就要想想其他方法,呵呵呵.挑战一下自己.单口nat说白了就是路由上就一个口,还必须要做

随机推荐