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);

 

 

重载流输入输出运算符“<<”,“>>”

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 的用途与局限

 

 

posted @ 2011-01-27 15:42  edwardlost  阅读(1313)  评论(0编辑  收藏  举报