【问题标题】:How to dump STDIN to a file, using C++ STL?如何使用 C++ STL 将 STDIN 转储到文件中?
【发布时间】:2012-09-18 09:33:39
【问题描述】:

我正在编写这个程序来解决这个问题:Why do I get 'Bad file descriptor' when trying sys.stdin.read() in subversion pre-revprop-change py script?

注意:

  • 来自 STDIN 的内容可以是任意二进制数据。
  • 请使用 C++ STL 函数、iostream、ifstream 等。
  • 如果文件创建/写入失败,我想捕获异常以了解情况。

【问题讨论】:

  • 在人们为您解决这些问题时,您想喝杯咖啡和饼干吗?
  • 天不准你去钻那些吓人的大书,或许有自己的学习经历……

标签: c++ stl


【解决方案1】:

最短的版本,可能是大多数系统上最快的版本:

#include <fstream>
#include <iostream>
int main() {
    std::ofstream("cin.txt", std::ios_base::binary) << std::cin.rdbuf();
}

【讨论】:

  • 非常感谢,非常简洁。我将 ios_base::binary 添加到您的代码中,否则,单个 \n 将在 Windows 上转换为 \r\n。
  • 是的,我注意到了这个问题。我是 UNIX 专家——在 UNIX 上没关系。
  • 但是...我试过了,如果 cin.txt 是只读的,那 ofstream 代码不会抛出异常。你能做进一步的改进吗?
  • 您可以在if 语句中检查表达式的状态。为了使流可能抛出(并可能得到一些错误的描述),您需要设置一个异常掩码(不过,我从来没有发现流异常的好用处)。
  • 你能更新代码吗?我只是想知道cin.txt是否写成功,--我认为这是一个体面的要求。
【解决方案2】:

我认为复制方法是你想要的:

template<class InputIterator, class OutputIterator>
OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result )
{
  while (first!=last) *result++ = *first++;
  return result;
}

例如:

copy(istream_iterator<string>(cin)
       , istream_iterator<string>()
       , ostream_iterator<string>(fout, "\n"));

这里的 fout 是一个文件流迭代器。

【讨论】:

  • 我假设您的意思是指出这是std::copy,这只是一个示例实现。
猜你喜欢
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
  • 2011-03-23
  • 2015-02-14
相关资源
最近更新 更多