C++输入输出流
标准输入输出格式符
scanf输入
%hd short
%lf double
printf输出
%td ptrdiff_t
%zd ssize_t
%zu size_t
std::getline()
该函数是个 non-member function,定义在 <string> 里边:
template <class Stream, class charT, class traits, class Allocator>
basic_istream<charT, traits>
getline(basic_istream<charT, traits> is, <charT, traits allocator> str, charT delim);
basic_istream<charT, traits>
getline(basic_istream<charT, traits> is, <charT, traits allocator> str, charT delim);
重载流输入输出运算符“<<”,“>>”
class Sales_item { /* 重载流输入 */ friend std::istream& operator>>(std::istream&, Sales_item&); /* 重载流输出 */ friend std::ostream& operator<<(std::ostream&, const Sales_item&); } std::ostream& operator<<(std::ostream& os, const Sales_item& item) { os << item.member; return os; }
格式化输出流
C++ Primer Appendix Section A.3 详细介绍了输出流格式化的相关内容
#include <iostream> #include <iomanip> #include <sstream> #include <string> using namespace std; void test_ostringstream() { int num = 1234; string payload = "神马都是浮云"; //设置显示宽度和填充字符 ostringstream os; os << std::setw(8) << std::hex << num; os << std::setw(32) << std::setfill(' ') << payload.substr(0, 32); std::cout << os.str() << std::endl; }
iostream 线程安全与原子性
iostream 的另外一个问题是线程安全性。iostream 在线程安全方面没有保证,就算单个 operator<< 是线程安全的,也不能保证原子性。因为 cout << a << b; 是两次函数调用,相当于 cout.operator<<(a).operator<<(b)。两次调用中间可能会被打断进行上下文切换,造成输出内容不连续,插入了其他线程打印的字符。而 fprintf(stdout, "%s %d", a, b); 是一次函数调用,而且是线程安全的,打印的内容不会受其他线程影响。
因此,iostream 并不适合在多线程程序中做 logging。
参考文章:
陈硕 - C++ 工程实践(7):iostream 的用途与局限