1022 字
5 分钟
面向对象考前速通笔记 (4) 文件I/O、异常处理

C++中,输入输出是基于字节流(stream)的操作。在进行操作的时候,可以把输入的数据堪称逐个字节地从外设流入到计算机内部。输出则是逐个字节流出到外设。

C++中有C语言保留下来的输入输出函数,比如scanfprintf,这是过程式的。

还有C++ I/O库中的类和对象,可以实现面向对象的输入/输出,例如,I/O库中的对象cin可以实现键盘的输入,cout可以用于显示字符。

cout 就是一个对象。它是 C++ 标准库根据 ostream 这个提前为我们创建好的一个具体实例。它的任务就是把数据输出到控制台(显示器)。

cin 也是一个对象。它是根据 istream (输入流) 这个创建的实例,专门负责从键盘读取数据。

我们使用 cout 时,就是在操作一个具体的“输出流对象”,命令它把我们的数据显示出来。比如:

int age = 20;
cout << "My age is: " << age; // 我们命令 cout 对象,把字符串和变量 age 的值显示出来。

一. 面向控制台的IO#

1. 控制台输入#

cin 也是一个对象。它是根据 istream (输入流) 这个创建的实例。同理coutostream 类的对象。

image-20250617112713193

这张图非常重要,它告诉我们:

ios 是这个家族的“老祖宗”,它定义了一些所有 I/O 流都共有的基础属性和功能(比如管理流的状态)。

istream (输入流) 和 ostream (输出流) 都继承自 ios。istream 专注于输入,定义了 >> 操作符。ostream 专注于输出,定义了 << 操作符。

iostream 同时继承了 istreamostream,所以它既能输入也能输出。

ifstream, ofstream, fstream 等是用来操作文件的,原理类似,我们以后会学到。

在使用I/O库的时候,首先要创建I/O对象,然后调用这个对象进行基于字节流代码输入/输出操作。这些对象有些有重载了 >><< 运算符,可以用于基本数据类型的输入和输出。

istream in(...); // 手动创建一个输入对象
in >> my_variable; // 输入给变量
ostream out(...); // 手动创建一个输出对象
out << "Hello";

但是我们好像很少这样子写,我们写的总是

cin >> my_variable;
cout << "Hello";

没有遇到过 istream in(...) 这种写法,是因为 C++ 标准库已经提前帮你把这件事做好了

针对控制台的输入/输出,在I/O库中预先定义了四个I/O对象cin,cout,cerr以及clog。这些可以直接用。这四个对象都是在头文件iostream中定义的。所以要

#include <iostream>

2. 控制台输出#

和输入类似的,不过要注意,输出指向字符的指针的时候,不是输出指针的值,而是自动转换成了它所指向的字符串。

const char *p = "Hello world!";
cout << p; // 输出字符串 Hello world!
cout << (void *)p;

输出控制符#

我们有的时候会用到

#include <iostream>
#include <iomanip>
cout << "abc" << endl;

这里endl是回车,这实际上就是操纵符。

可以用hex操纵符把后续的输出格式改成十六进制。(是后续,也就是说不改回来这个程序里就一直这样了)

#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int x = 10;
cout << hex << x << x << oct << x << endl;
cout << x ;
return 0;
}
image-20250617114540470

可以看到不手动切回来,后续就一直这样子了。

image-20250617114653357

3. 重载>>,<<#

如果有个类:

class A {
int x, y;
};

要直接输出:

class A {
int x, y;
friend ostream& operator << (ostream& out, const A &a); // 访问私有对象要声明友元
};
ostream& operator << (ostream& out, const A &a) {
out << a.x << a.y;
}

二. 面向文件的IO#

(下面的都略了,看书就好了,不过这里都会考)

三. 面向字符串的IO#

四. C++ 异常处理#

面向对象考前速通笔记 (4) 文件I/O、异常处理
https://fuwari.vercel.app/posts/course/ooap/oopa-note-4/
作者
wegret
发布于
2025-06-16
许可协议
CC BY-NC-SA 4.0