标准输入输出格式符
scanf输入
%hd short
%lf double
printf输出
%td ptrdiff_t
%zd ssize_t
%zu size_t
std::getline()
该函数是个 non-member function,定义在
template<classStream,classcharT,classtraits,classAllocator>
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 的用途与局限
原文链接: https://www.cnblogs.com/edwardlost/archive/2011/01/27/1882124.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/20522
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!