C++编程思想第二版第二卷笔记3——输入输出流

本文详细介绍了C++中的输入输出流概念,包括基本用法、文件流模式、流状态管理、格式控制等内容,并提供了自定义控制操作符的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

输入输出流的灵活、安全、易用是使它替代C风格的输入输出函数的主要原因。

上图是输出输出流的简化类图,可以看到,各种各样的输入输出类都派生自同一个类。

输入输出流最基本的两个运算符就是插入号(inserter<<和提取号(extractor>>

基本用法:

cout << 目标;//输出目标,即将信息插入目标

cin >> 目标;//读取目标,即从外界提取信息

行操作函数: 

成员函数get( )getline( )

头文件<string>中定义的全局函数getline( )

流状态

badbit

 产生了某种致命(可能是硬件)错误。此时不应当考虑使用该流。

eofbit

 输入结束(可能是读到了流的结束位置,也可能是用户用Ctrl+ZCtrl+D关闭了控制台流。

failbit

 输入输出操作失败,这种情况通常是数据不可用造成的(例如在试图读取数字时却读到了字符)。这样的流不可以使用。当输入结束时,也会设置failbit标志。

goodbit

 一切正常,没有任何错误。输入也还没有结束。

文件流:和其他的流一样,都有<<>>两个运算符,用法是一样的,只不过操作对象是文件。

文件流模式:

ios::in

 以读取方式打开文件。使用这个模式打开文件可以防止对已有文件的误写操作。

ios::out

 以写入方式打开文件。使用此标志时,如果没有同时使用ios::appios::ateios::in ,则标志ios::trunc默认是为真的。

ios::app

 以追加方式打开文件(只模式下只可以向文件追加内容)。

ios::ate

 打开文件并把操作指针移动到文件末尾(可以是打开文件,也可以是写入文件)

ios::trunc

 如果旧文件存在,则修改旧文件。

ios::binary

 以二进行模式打开一个文件。默认是文本模式。

 

输入输出流缓存(Iostream buffering),如上图,是为用户提供的操作二进制流内容的类。

输入输出流的内部查找方向:

ios::beg

 从流的开头。

ios::cur

 从当前位置。

ios::end

 从流的结尾。

字符串输入输出流格式控制:

ios::skipws

 忽略空格(输入时默认是开启的)

ios::showbase

 这里指的是输出时显示合法值的进制前缀(比如,可以设置为十进行、八进制、十六进制等)。此标志开启时,输入流也可以辨识进制前缀。

ios::showpoint

 显示浮点数的小数点及精确度(也就是小数点后面有几个零)

ios::uppercase

 将十六进行中的A-F以及科学计数中的E以大写形式显示。

ios::showpos

 显示正数的“+”号。

ios::unitbuf

 “单位缓存”(“Unit buffering.”)。每次插入都马上清空缓存。

进行操作控制:

ios::dec

 将整型数据按十进行格式化(默认进制——显示值时不带前缀)。

ios::hex

将整型数据按十六进行格式化。

ios::oct

将整型数据按八进行格式化。

ios::scientific

 以科学计数方式显示浮点型数据。精确位表明小数点后精确的位数。

ios::fixed

 以固定格式显示浮点型数据。精确位表明小数点后精确的位数。

“自动浮点格式”(没有设置任何浮点格式时)精确位表明所有的有效数字。

ios::left

 左对齐数值,在右侧不足位填充字符。

ios::right

左对齐数值,在右侧不足位填充字符。这是默认的对齐方式。

ios::internal

 在任意标志或数制符后,数值之前填入字符。

Function

 Effect

 

int ios::width( )

 返回当前宽度。默认值是零。可以用于输入与输出。

int ios::width(int n)

 设置宽度,返回设置前的宽度。

int ios::fill( )

 返回当前填充字符。默认是空格。

int ios::fill(int n)

 设置填充字符,返回设置前的填充字符。

int ios::precision( )

 返回当前浮点数精度。默认是6

int ios::precision(int n)

 设置浮点精度,返回设置前精度。

控制操作符(Manipulators),C++提供了丰富的控制操作符(带参数和不带参数的),且还可以通过如下方式自定义:

//: C04:nl.cpp

// Creating a manipulator.

#include <iostream>

using namespace std;

 

ostream& nl(ostream& os) {

  return os << '/n';

}

 

int main() {

  cout << "newlines" << nl << "between" << nl

       << "each" << nl << "word" << nl;

} ///:~

 

//: C04:Effector.cpp

// Jerry Schwarz's "effectors."

#include <cassert>

#include <limits>  // For max()

#include <sstream>

#include <string>

using namespace std;

 

// Put out a prefix of a string:

class Fixw {

  string str;

public:

  Fixw(const string& s, int width) : str(s, 0, width) {}

  friend ostream& operator<<(ostream& os, const Fixw& fw) {

    return os << fw.str;

  }

};

 

// Print a number in binary:

typedef unsigned long ulong;

 

class Bin {

  ulong n;

public:

  Bin(ulong nn) { n = nn; }

  friend ostream& operator<<(ostream& os, const Bin& b) {

    const ulong ULMAX = numeric_limits<ulong>::max();

    ulong bit = ~(ULMAX >> 1); // Top bit set

    while(bit) {

      os << (b.n & bit ? '1' : '0');

      bit >>= 1;

    }

    return os;

  }

};

 

int main() {

  string words = "Things that make us happy, make us wise";

  for(int i = words.size(); --i >= 0;) {

    ostringstream s;

    s << Fixw(words, i);

    assert(s.str() == words.substr(0, i));

  }

  ostringstream xs, ys;

  xs << Bin(0xCAFEBABEUL);

  assert(xs.str() ==

    "1100""1010""1111""1110""1011""1010""1011""1110");

  ys << Bin(0x76543210UL);

  assert(ys.str() ==

    "0111""0110""0101""0100""0011""0010""0001""0000");

} ///:~

宽字符,因为有些编译器不支持,不详述了,用到的自己查吧。

本地化,可以使用Locales.

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值