在 C++ 中实现 unix 实用程序“head”

Implement unix utility "head" in C++

提问人:Aaron Frantisak 提问时间:10/24/2020 更新时间:10/24/2020 访问量:121

问:

我正在尝试在 C++ 中实现 unix 实用程序“head”。我正在覆盖 std::stringbuf::sync 并返回 eof()。但是在 ostream 上,eof 没有设置。更好的是,如果它抛出一个例外就好了。在线验证码

#include <iostream>
#include <sstream>
#include <vector>

class Head : public std::stringbuf {
public:
  Head(std::size_t max) : max(max) {}

  int_type sync() override {
    if (lines.size() < max) {
      lines.push_back(str());
      str(std::string());
      return 0;
    }
    return traits_type::eof();
  }

  const std::size_t max;
  std::vector<std::string> lines;
};

int main(int, char*[]) {
  auto head = Head{2};
  std::ostream stream(&head);
  for (auto i = 0; i < 3; ++i) {
    stream << i << std::endl;
    std::cout << "eof: " << stream.eof() << " good: " << stream.good() << std::endl;
  }
}

输出:

eof: 0 good: 1
eof: 0 good: 1
eof: 0 good: 0 // eof should be 1?
C++ 标准 IOstream unix-head

评论

0赞 Sam Varshavchik 10/24/2020
不,那不是这个意思。返回 -1 from 会使流进入失败状态。eofsync()
0赞 Aaron Frantisak 10/24/2020
如何让 eof() 在达到最大大小时返回 true 和/或抛出异常?
0赞 Sam Varshavchik 10/24/2020
你不能。 不由输出流使用。 由输入流使用。自定义子类是输出流。eof()eof()

答: 暂无答案