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

How do I pass a specific number of characters from an istream to an ostream

本文关键字:istream ostream 字符      更新时间:2023-10-16

我有一个istream(在本例中是ifstream),我想从它写入一个特定数量的字符到ostream(具体来说是cout)。

我可以看到使用iststream .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

我期望的输出是:

测试we

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

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

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

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

我很确定这比读取缓冲区或其序列并写入缓冲区要慢得多(顺便说一句,请确保调用std::ios_base::sync_with_stdio(false),否则std::cout可能会很慢)。

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

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