只是出于好奇,iostream 如何访问输入输出系统。(我有一个不断重新发明轮子的坏习惯,我想知道我是否可以为 iostream 之类的东西构建一个自定义输入输出系统)。
4 回答
有关 IOstreams 的详细指南,请参阅Standard C++ IOStreams and Locales一书。读完之后,我怀疑你会满足于现状——IOStreams 可能是 C++ 标准库中最复杂的部分。
这取决于...
它以某种方式与操作系统的本机 IO 系统交互。它可能在内部使用 C 库,该库使用对内核的系统调用,或者它可能直接使用系统调用。确切的实现高度依赖于平台。
很多人会说不要重新发明轮子,但这可能是一次很好的学习经历。如果您使用的是 Windows,请查看用于文件处理的 Win32 API 调用。如果你使用 Linux,要么使用 POSIX/C 库,要么使用系统调用(更难,我建议使用 C 库)。
你当然可以重新发明轮子。
流操作符处理国际字符集增加了很多复杂性。在相当深入地看了它之后,我真的不太在乎它。它非常复杂,完全破坏了任何轻松使用继承的机会。它可以工作并且可用。(我想改变它在转换过程中使用的存储行为)
所有流都进入一个streambuf。该streambuf 将取决于流的类型。一个 ofstream 进入一个 fstreambuf;cout 转到一些未指定的流缓冲区。如果你想定制一些东西,cout 允许你获取这个 streambuf 并可能替换它。
一个常见的模式是“过滤流缓冲”,它是一个流缓冲接口,它在将其输入发送到另一个流缓冲之前对其进行转换。这可以与 cout 结合使用:取出原始流缓冲区,将其包装在过滤流缓冲区中,然后将该包装器放回 cout。您不需要知道原始流缓冲区是如何工作的。