如何将特定数量的字符从istream传递到ostream
How do I pass a specific number of characters from an istream to an ostream
我有一个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;
相关文章:
- 需要从 istream 和 ostream 派生 iostream
- 逗号在重载 ostream 和 istream 在结构中分开
- 为什么 Clang std::ostream 写一个 std::istream 无法读取的双精度?
- C++ 模板类无法修复 ostream 和 istream 函数
- C++使 ostream 和 istream 运算符过载
- 尝试重载时'ostream'和'istream'错误C++
- 如何从 istream、ostream 正确继承我的类?
- C++,错误:" no operator "== " matches these operands ",ostream/istream
- 将带有C++的二进制文件从 istream 复制到 ostream 并不总是正确的
- 带有 ostream 和 istream 的 C++ 向量
- 带有数组的 istream / ostream 参数
- C++ istream >> 和 ostream << 错误
- 用于使用 istream/ostream 传输消息的类似网络协议
- Streambuf、Ostream、Ostreambuf、iStream、ISTREAMBUF 和相关迭代器
- 为什么我们需要在重载>>和<<运算符时返回对 istream/ostream 的引用?
- 为什么不能重新分配给对 istream / ostream 的引用
- 为什么 istream/ostream 很慢
- istream (ostream) vs. bool
- istream >> ostream << 运算符重载与 * 指针
- 为什么在istream / ostream的IO函数中取消一个pthread会设置坏位?