std::stringstream

本文详细讲解了C++中文件操作的iostream库使用,包括std::ios_base不同模式如in、out、app、ate、trunc的应用,以及如何避免文件内容被意外清空。通过Test1和Test2函数展示了字符串流和文件流的操作技巧。
摘要由CSDN通过智能技术生成
#include <iostream>
#include <sstream>  //istringstream 必须包含这个头文件
#include <string>
using namespace std;

/*
std::ios_base::openmode
std::ios_base::in: 打开文件进行读操作,即读取文件中的数据
如果指定路径中没有包含该文件,不会创建,而且设置std::ios_base::badbit.
std::ios_base::out: 打开文件进行写操作,即写入数据到文件。
如果指定路径中并没有包含该文件,会创建一个新的.文件
如果指定的路径中包含有该文件,那么打开后,会清空文件中内容,其实就是暗含了std::ios_base::truc.
std::ios_base::in | std::ios_base::out: 打开文件进行读写操作
如果指定的路径没有包含该文件,也不会创建,并且会设置std::ios_base::badbit.
std::ios_base::app: 每次进行写入操作的时候都会重新定位到文件的末尾.
如果指定路径不存在该文件那么创建一个.
std::ios_base::ate: 打开文件之后立即定位到文件末尾
如果指定的路径不存在该文件不会创建.
std::ios_base::trunc: 打开文件,若文件已存在那么,清空文件内容.
如果指定的路径不存在该文件不会创建.如果指定的路径含有该文件那么清空文件中的内容.
std::ios_base::binary: 以二进制的方式对打开的文件进行读写.
如果指定的路径不存在该文件不会创建.
总结:
1,凡包含std::ios_base::out mode的操作方式,如果文件不存在都是会创建.
std::ios_base::out | std::ios_base::app/ate/trunc 这些组合的方式来操作文件,
如果指定的路径该文件不存在就会创建一个空的.
2,如果std::ios_base::in 和 std::ios_base_out同时使用就会按照
std::ios_base_in,也就是即使文件不存在也不会创建. 3,std::ios_base::in |
std::ios_base::out | std::ios_base::app/ate/trunc 这些组合的方式来操作文件,
如果指定路径的文件不存在也不会创建而且会把当前stream的state设置为std::ios_base::badbit.
4,由于std::ios_base::out和std::ios_base::trunc单独使用的时候在打开已存在文件的情况下都会清空文件内容,
因此我们使用的时候要格外注意.例如:我们可以通过std::ios_base::out |
std::ios_base::app组合的形式来消除打开已存在文件时候的清空动作.
*/

void Test1() {
  string str = "i am a boy";
  istringstream is(str);
  string s;
  while (is >> s) {
    cout << s << endl;
  }
}

void Test2() {
  // default constructor (input/output stream)
  std::stringstream buf1;
  buf1 << 7;
  int n = 0;
  buf1 >> n;
  std::cout << "buf1 = " << buf1.str() << " n = " << n << '\n';

  // input stream
  std::istringstream inbuf("-10");
  inbuf >> n;
  std::cout << "n = " << n << '\n';

  // output stream in append mode (C++11)
  std::ostringstream buf2("test", std::ios_base::ate);
  buf2 << " 123";
  int x = 456;
  buf2 << x;
  std::cout << buf2.str() << '\n';

  std::ostringstream buf3("test");
  buf3 << "12";
  //   int x3 = 456;
  //   buf3 << x3;
  std::cout << buf3.str() << '\n';

  /*
  其中,stringstream.str(std::string())的作用是清空stringstream内部的字符串内容,
  stringstream.clear()的作用是将该流中所有的状态位复位,将流的状态设置为有效。这一句也很关键,
  这是因为当流发生错误后,其上后续的IO操作都会失败,只有当一个流处于无错状态时,
  我们才可以从他读取数据和写入数据。
  */
  buf3.str(std::string());
  buf3.clear();
}

int main() {
  cout << "===========================" << endl;
  Test1();
  cout << "===========================" << endl;
  Test2();
  return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海洋2416

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值