C++输入输出流

标准输入输出格式符

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

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午10:05
下一篇 2023年2月7日 下午10:05

相关推荐