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 回答