ロボットと趣味と自堕落と

ロボットの事なんか一言も書いてない

std::stringstreamをクリアする

やり方

すごく初歩的な事だけど、最近知ったので。
std::stringstreamに格納されてる値をクリアにして別の値を入れる時に必要な処理

#include <iostream>
#include <sstream>

using namespace std;
int main(int argc, char* argv[]){
  stringstream ss;
  ss << "hoge";

  cout << ss.str() << endl;

  //ssをクリアする
  ss.str("");
  ss.clear(stringstream::goodbit);

  ss << "fuga";
  cout << ss.str() << endl;

  return 0;
}
hoge
fuga

ソースコードから複数のディレクトリに入ってるファイルを逐次参照するプログラムとかに使える。

使ってみた

data
  L dir1
      L file1.dat
    dir2
      L file2.dat
    dir3
      L file3.dat
    dir4
      L file4.dat

みたいなディレクトリ階層を作って、各ディレクトリのfile*.datを見るプログラムを作ってみた。
各file*.datにはファイルパスを書いておく。

#include <iostream>
#include <sstream>
#include <fstream>

using namespace std;
int main(int argc, char* argv[]){
  stringstream dir;
  string path = "./data/dir";
  string file = "file"

  for(int i = 0; i < 4; i++){
    dir << path << i+1 << "/" << file << i+1 << ".dat";
    ifstream ifs(dir.str().c_str());
    string line;
    while(getline(ifs, line)){
      cout << line << endl;
    }
    dir.str("");
    dir.clear(stringstream::goodbit);
  }

  return 0;
}
./data/dir1/file1.dat
./data/dir2/file2.dat
./data/dir3/file3.dat
./data/dir4/file4.dat

といった感じ。
OpenCVとかで作った行列データをyamlにして別々のディレクトリに保存したり読みだしたりする場合とかに使える。
(std::ifstreamのところはdir.str().c_str()としててちょっとアレだけど…)

参考HP

stringstreamのクリアの仕方 - りんでん記


[追記 2015/3/18]
ファイル逐次読み出しのソースをちょっと改変