8

区切り文字であるドル記号に到達するまで、ファイルから文字列を読み取っています。ただし、入力イテレータは空白をスキップしているため、作成された文字列にはスペースがありません。この場合、私が望むものではありません。スキップ動作を停止する方法はありますか? もしそうなら、どのように?

これが私のテストコードです。

#include <iostream>
#include <fstream>
#include <iterator>
#include <string>

// istream iterator is skipping whitespace.  How do I get all chars?
void readTo(std::istream_iterator<char> iit, 
            std::string& replaced)
{
   while(iit != std::istream_iterator<char>()) {
     char ch = *iit++;
     if(ch != '$')
      replaced.push_back(ch);
     else
        break;
   }
}

int main() {
   std::ifstream strm("test.txt");
   std::string s;
   if(strm.good()) {
       readTo(strm, s);
       std::cout << s << std::endl;
   }

    return 0;
}
4

1 に答える 1

13

ストリームはデフォルトで空白をスキップするように設定されているため、

noskipws(strm);

標準:

basic_ios コンストラクター

explicit basic_ios(basic_streambuf<charT,traits>* sb);

効果: クラス basic_ios のオブジェクトを構築し、呼び出しによってメンバー オブジェクトに初期値を割り当てます。init(sb).

basic_ios();

効果: クラスbasic_ios(27.5.2.7) のオブジェクトを構築し、そのメンバー オブジェクトは初期化されていません。オブジェクトは、initメンバー関数を呼び出すことによって初期化されます。初期化される前に破棄された場合、動作は未定義です。

[...]

void init(basic_streambuf<charT,traits>* sb);

事後条件: この関数の事後条件を表 118 に示します。

+----------+-------------+
| ...      | ...         |
| flags()  | skipws|dec  | 
| ...      | ...         |
+----------+-------------+
  (Table 118)
于 2013-06-10T11:06:30.713 に答える