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和位置指针进行持续性的写入