3

只是出于好奇,iostream 如何访问输入输出系统。(我有一个不断重新发明轮子的坏习惯,我想知道我是否可以为 iostream 之类的东西构建一个自定义输入输出系统)。

4

4 回答 4

10

有关 IOstreams 的详细指南,请参阅Standard C++ IOStreams and Locales一书。读完之后,我怀疑你会满足于现状——IOStreams 可能是 C++ 标准库中最复杂的部分。

于 2009-05-21T21:25:31.030 回答
3

这取决于...

它以某种方式与操作系统的本机 IO 系统交互。它可能在内部使用 C 库,该库使用对内核的系统调用,或者它可能直接使用系统调用。确切的实现高度依赖于平台。

很多人会说不要重新发明轮子,但这可能是一次很好的学习经历。如果您使用的是 Windows,请查看用于文件处理的 Win32 API 调用。如果你使用 Linux,要么使用 POSIX/C 库,要么使用系统调用(更难,我建议使用 C 库)。

于 2009-05-21T20:51:22.393 回答
1

你当然可以重新发明轮子。

流操作符处理国际字符集增加了很多复杂性。在相当深入地看了它之后,我真的不太在乎它。它非常复杂,完全破坏了任何轻松使用继承的机会。它可以工作并且可用。(我想改变它在转换过程中使用的存储行为)

于 2009-05-21T21:10:04.103 回答
1

所有流都进入一个streambuf。该streambuf 将取决于流的类型。一个 ofstream 进入一个 fstreambuf;cout 转到一些未指定的流缓冲区。如果你想定制一些东西,cout 允许你获取这个 streambuf 并可能替换它。

一个常见的模式是“过滤流缓冲”,它是一个流缓冲接口,它在将其输入发送到另一个流缓冲之前对其进行转换。这可以与 cout 结合使用:取出原始流缓冲区,将其包装在过滤流缓冲区中,然后将该包装器放回 cout。您不需要知道原始流缓冲区是如何工作的。

于 2009-05-22T09:09:13.173 回答