《Hands-On System Programming with C++》读书笔记之六
基于流的IO
与C语言的printf()和scanf()不同,C++的输入输出基于流。
std::cout和std::wcout对象都是std::ostream类的实例,他们输出数据到标准C的stdout(即当前标准输出设备,可以是屏幕、打印机或文件),前者支持ASCII,后者支持Unicode。
类似地,std::cin和std::wcin接收来自stdin的数据。
C++基于流的IO之优劣
C++基于流的IO之优势
- 简洁、安全的支持用户定义类型
- 防止大量的由空间溢出引起的安全隐患
- 隐式的提供内存管理
后面对这些点进行了解释。
C++基于流的IO之劣势
- 标准C的printf()往往性能更好
- 格式限定符比的灵活性更好
Beginning with user-defined types
可以通过重载<<和>>操作符实现对自定义类型的输入输出支持。
#include <string.h>
#include <iostream>
#include <fcntl.h>
class custom_errno
{
};
std::ostream &operator << (std::ostream &os, const custom_errno &e)
{
return os << strerror(errno);
}
int main()
{
if (open("do_not_exist.txt", O_RDWR) == -1)
std::cout << custom_errno{
} << std::endl; // No such file or directory
}
上例中我们创造了一个空类型并重载了<<操作符对它的操作。这里用它来输出errno(一个指示错误的宏)对应的信息。
同样可以重载<<操作符。
#include <iostream>
struct object_t
{
int data1;
int data2;
};
std::ostream &operator <<(std::ostream &os, const object_t &obj)
{
os << "data1: " << obj.data1 << '\n';
os << "data2: " << obj.data2 << '\n'