【问题标题】:Having trouble understanding C++ streams无法理解 C++ 流
【发布时间】:2020-12-16 21:51:42
【问题描述】:

我必须从输入流中读取一些数据,通过一些过滤器运行它,然后在屏幕上显示上下文。我正在使用 Windows,目前坚持这一点。我很难理解 I/O 流。

我不知道在通过第一个过滤器传递数据后我应该做什么,因为目前,第二个函数计算 0 个字符?

主要:

std::ifstream data("somedata.txt");
whitesprem(data);
calc_chars(data);

whitesprem:

    // removes extra white spaces

    void whitesprem(std::ifstream& fff) {
        std::string line;

        while(std::getline(fff, line)){
          std::regex rgx("\\s{2,}");
          line = std::regex_replace(line, rgx, " ")
          //How to move on?
       }    
   }

【问题讨论】:

  • 如果您想从流中过滤字符,您应该查看streambuf 类。 stream 派生类没有您正在寻找的功能。
  • 在上面做一点扩展。 stream 派生类包装 streambuf 派生类。所有stream 类真正做的是包装不同的streambuf 派生类并提供一些更高级别的I/O 方法。实际的低级 I/O 由streambuf 派生类完成。所以如果你想写一个过滤后的流,方法是写一个streambuf派生类来做过滤。然后你可以有一个streambuf 派生类链,每个派生类都执行一些操作(过滤、转换或其他),直到链中的最后一个streambuf 执行实际的 I/O。
  • 最后,您编写了一个 stream 派生类,它包装了链中的第一个 streambuf 以提供熟悉的更高级别的 I/O 操作。

标签: c++ stream


【解决方案1】:

我会使用您的whiteprem() 中的每一行。另一种方法可能是将数据从文件流复制到另一个字符串流,然后在程序的其余部分使用新流。

可能你打算做这样的事情:


void whiteprem(std::ifstream& ff, std::stringstream &update){
std::string line;

        while(std::getline(fff, line)){
          std::regex rgx("\\s{2,}");
          line = std::regex_replace(line, rgx, " ")
          //How to move on?
          update << line << std::endl;
       }

}
int main(){
  std::ifstream data("somedata.txt");
  std::stringstream ss;
  whitesprem(data, ss);
  calc_chars(ss);
}

【讨论】:

  • 非常感谢!您还说过,一种方法可能是“消耗”每一行。你这是什么意思?
  • 比如,使用line 字符串计算whiteprem() 方法中的字符长度。如果你的calc_chars 是一个大函数,也许这不是一个好主意。
猜你喜欢
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多