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 的用途与局限
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号