【问题标题】:input iterator skipping whitespace, any way to prevent this skipping输入迭代器跳过空白,任何防止这种跳过的方法
【发布时间】:2013-06-10 10:48:14
【问题描述】:

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

这是我的测试代码。

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

【问题讨论】:

    标签: c++ istream


    【解决方案1】:

    由于流默认配置为跳过空格,因此,请使用

    noskipws(strm);
    

    标准:

    basic_ios 构造函数

    explicit basic_ios(basic_streambuf&lt;charT,traits&gt;* sb);

    作用:构造一个basic_ios类的对象,通过调用init(sb).为其成员对象赋初值

    basic_ios();

    效果:构造 basic_ios (27.5.2.7) 类的对象,使其成员对象未初始化。 该对象应通过调用其init 成员函数来初始化。如果它在它被摧毁之前被摧毁 初始化行为未定义。

    [...]

    void init(basic_streambuf&lt;charT,traits&gt;* sb);

    后置条件:该函数的后置条件如表 118 所示。

    +----------+-------------+
    | ...      | ...         |
    | flags()  | skipws|dec  | 
    | ...      | ...         |
    +----------+-------------+
      (Table 118)
    

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 2017-11-27
      • 2021-06-22
      • 2021-10-13
      相关资源
      最近更新 更多