std::istringstreamで途中まで読み込んだ文字列の残りをstd::stringとして取得する

最近は読書記録ブログと化しているのでひさびさの技術メモ.

std::istringstreamを使って入力を解析することが多いのだけれど,一部分だけ読み込んだ後に残りの文字列をstd::stringとして他の処理に使いたいことがある.そんなときにstd::istringstream::str()を利用すればいいんじゃないの? と思っていたのだけれど,そうすると読み出した文字列もひっくるめた文字列を返してしまう.解決方法がわからず,しばらくはまったのでメモ.

そこで内部で保持しているポインタ情報を利用してstd::string::substring()で部分文字列を取得するという方法で解決することにした.きっともっとよい方法があるはずだけれど,動けばよい方式で今回はここまで.

#include <iostream>
#include <sstream>
#include <string>

int
main ()
{
  std::string str("hoge fuga piyo");
  std::istringstream iss( str );

  std::string tmp;
  iss >> tmp;

  // tmpにhogeを読み出したのでfuga piyoが表示されることを期待                                                                                                                                              
  std::cout << iss.str() << std::endl;      // => "hoge fuga piyo" と表示                                                                                                                                  

  // iss.tellg()で現在読み込み終わったバッファ位置を取得できるので                                                                                                                                       
  // +1以降の部分文字列をstring::substr()で取得することで残りの文字列を取得                                                                                                                 
  std::string new_str = str.substr( (int)iss.tellg() + 1);
  std::cout << new_str << std::endl;        // => "fuga piyo" と表示                                                                                                                               
  
  return 0;
}

こういう処理を行うときによくハマのだけれどそのたびにC++が嫌いになる.Cだともっと面倒だけれど書けばできるので.