输入迭代器跳过空格,以任何方式防止这种跳过

时间:2013-06-10 10:48:14

标签: c++ istream

我正在从一个文件中读取一个字符串,直到我达到一个分隔字符,即美元符号。但输入迭代器正在跳过空格,因此创建的字符串没有空格。在这种情况下不是我想要的。有没有办法阻止跳绳行为?如果是这样的话?

这是我的测试代码。

#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;
}

1 个答案:

答案 0 :(得分:12)

因为默认情况下将流配置为跳过空格,所以请使用

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)