C++语言stream类型 & 读取格式化数据常用方法

stream

  • 读取和写入实际上都有指针指着当前位置
  • c++最好还是用stream类型处理字符串流和文件流,结合getline读入到目的字符串中,比较方便
  • demo
    #include <fstream>
    #include <sstream>
    #include <iostream>
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <vector>
    
    using std::ifstream;
    using std::string;
    using std::vector;
    
    void getTMFromFile(vector<vector<uint32_t>> &tm, string fileName, uint32_t NODE_NUM)
    {
    // 使用fstream处理文件流
    ifstream inFile = ifstream(fileName.c_str(), ios_base::in);
    if (!inFile)
    {
        std::cout << "Can not open file..." << fileName;
    }
    
    /*文件格式:
    10.2.1.2, 10.2.2.3,10.2.3.3,....,10.2.node_num.3
    0,1,2,3,...,packet_num[node_num]
    10.2.1.2, 10.2.2.3,10.2.3.3,....,10.2.node_num.3
    0,1,2,3,...,packet_num[node_num]
    */
    
    string ip_strs, pktcnt_strs;
    string ip, pktcnt;
    // read each line into xx_strs, and split them into ip/pktcnt
    for (uint32_t node = 1; node <= NODE_NUM; node += 1) // for each two line
    // for (uint32_t node = 0; node < 1; node += 1)
    {
        // 读入两行
        getline(inFile, ip_strs); //* default seperator is '\n'
        getline(inFile, pktcnt_strs);
    
        // 拆开处理
        stringstream ip_stream = stringstream(ip_strs);
        stringstream pktcnt_stream = stringstream(pktcnt_strs.substr(0, pktcnt_strs.rfind(','))); //去掉最后一个逗号及后面的空白
        uint32_t fromNode = NODE_NUM + 10, tmpNode = 0;
        // 指定分隔符读取字符串,每次读取一个,stream类型的指针会记录当前的位置
        while (getline(ip_stream, ip, ',') && getline(pktcnt_stream, pktcnt, ','))
        {
        // 解析ip,获取当前的节点
        if (ip.size()) // 防止空字符串
        {
            uint32_t comma_cnt = 0;
            uint32_t beginPos = 0, endPos = 0;
            while (comma_cnt < 3) // 10.2.x.1 要取出x部分
            {
            beginPos = endPos;
            endPos = ip.find('.', endPos + 1);
            comma_cnt += 1;
            }
            tmpNode = atoi(ip.substr(beginPos + 1, endPos - beginPos - 1).c_str());
            if (fromNode == NODE_NUM + 10)
            {
            fromNode = tmpNode;
            }
        }
    
        if (pktcnt.size()) // 防止空字符串
        {
            uint32_t sendPkts = atoi(pktcnt.c_str());
            tm[fromNode][tmpNode] = sendPkts;
        }
        }
    }
    }
    

std::ostringstream用法详解举例

优点:

  • 我们有时需要格式化一个字符串,但不知道需要多大的缓冲区。为了保险常常申请大量的缓冲区以防止缓冲区过小造成字符串无法全部存储。
  • 这时我们可以考虑使用ostringstream类,该类能够根据内容自动分配内存,并且其对内存的管理也是相当的到位。

ostringstream的构造函数形式:

  • demo
    #include<sstream.h>
    
    explicit ostringstream ( openmode which = ios_base::out );  
    explicit ostringstream ( const string & str, openmode which = ios_base::out );  
    
    #n 构造方式 1  
        ostringstream ostr1;
    #n 构造方式 2
        ostringstream ostr2("abc"); 
    

常用函数

跟普通流的操作方式一致

  • ostr1 << “ostr1” << 2012 << endl;

    格式化,此处endl也将格式化进ostr1中

  • cout << ostr1.str();

    .str()会解格式化

  • ostr1.clear()
  • ostr1.seekp( int pos)

    手动设置put pointer的值

  • ostr2.put(‘g’);

    在put pointer的位置上写入’g’,并将put pointer指向下一个字符位置

  • long curPos = ostr2.tellp();

    返回当前插入的索引位置(即put pointer的值),从0开始

note

  • ostr1 << “haha”;会覆盖原有的内容,所以可以使用sprintf和位置指针进行持续性的写入
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值