如何将特定数量的字符从istream传递到ostream

时间:2014-03-15 19:03:24

标签: c++ stl istream ostream

我有一个istream(ifstream,在这种情况下),我想从中将特定数量的字符写入ostream(cout,具体而言)。

我可以看到使用像istream.get()这样的东西是可能的,但这会创建一个中间缓冲区,这是我宁愿避免的。

类似的东西:

size_t numCharacters = 8;
ostream.get(istream, numCharacters);

有人能指出我正确的方向吗?

感谢阅读:)

编辑:添加了c ++标签 编辑:固定标题:/

新编辑:

非常感谢答案的人。作为旁注,任何人都可以解释copy_n这种奇怪的行为吗?基本上它似乎不消耗从输入流复制的最后一个元素,即使该元素出现在输出流中。下面的代码应该说明:

string test = "testing the weird behaviour of copy_n";
stringstream testStream(test);

istreambuf_iterator<char> inIter( testStream );
ostream_iterator<char> outIter( cout );

std::copy_n(inIter, 5, outIter);
char c[10];
testStream.get(c,10);
cout << c;

我得到的输出是:

  

见证w

我期望的输出是:

  

测试我们

cppreference.com上的文档中没有提到这种行为。任何进一步的帮助将不胜感激:)

我目前的解决方法是在复制后寻找一个额外的元素 - 但这显然不太理想。

1 个答案:

答案 0 :(得分:2)

如果要限制要高效的字符数,则无法避免复制字节。对于没有缓冲区的慢速版本,您可以使用std::copy_n()

std::copy_n(std::istreambuf_iterator<char>(in),
             std::istreambuf_iterator<char>(),
             std::ostreambuf_iterator<char>(out),
             n);

我很确定这比读取缓冲区或其序列并写入缓冲区要慢得多(BTW请务必调用std::ios_base::sync_with_stdio(false),否则可能会很慢std::cout)的所有内容。

您还可以创建一个过滤流缓冲区,即使用另一个流缓冲区作为其数据源从std::streambuf派生的类。过滤器将在n字符后指示不再有字符。它内部仍然使用缓冲区,因为字符的单独处理很慢。然后它可以用作:

limitbuf buf(in, n);
out << &buf;