【问题标题】:What's the relationship between I/O streams with outer devicesI/O流与外部设备有什么关系
【发布时间】:2015-12-22 07:00:21
【问题描述】:

目前我正在自学 C++。我对流和外部设备之间的关系感到很困惑。 cplusplus关于基本I/O的解释是

无需了解与流相关的媒体或其任何内部规范的详细信息。我们需要知道的是,流是字符的源/目标,并且这些字符是按顺序提供/接受的(即一个接一个)。

那么“流是字符的源/目标”是什么意思。 以监视器为例,字符的目的地不应该是监视器而不是流?或者我可以将监视器作为流?如果是,那么如何理解以下内容:

输出流对象可以写入字符序列并表示其他类型的数据。提供了特定的成员来执行这些输出操作(参见下面的函数)。 标准对象 cout、cerr 和 clog 就是这种类型的对象。

认为 cout、cerr 和 clog 是监视器的对象实在是太过分了…… 我宁愿将输出流作为与监视器不同的对象。

有人可以简单地向我解释一下 I/O 流和外部设备之间的真正联系是什么以及它是如何工作的吗?非常感谢!

【问题讨论】:

  • 您正在寻找的连接依赖于实现,iostreams 应该是一个抽象。在 Linux 和其他 Unix 操作系统下:是的(是的,Linux 是一个 Unix 操作系统,是的,Linux 是一个操作系统,而不仅仅是一个内核),我已经看到连接到网络套接字的 iostream 变体(2003 年左右的 gcc 扩展)以及更多普通 I/O 通道作为终端和普通 UTF-8/8859-1 文本文件。

标签: c++ stream


【解决方案1】:

流只是对各种设备的抽象,它们的共同点是您可以在其中写入字符。确切的实现取决于操作系统(尽管在现代操作系统上,C++ 流包装了操作系统提供的流)。

控制台?您可以在其中写入字符(并将它们显示在屏幕上)。一份文件?您可以在其中写入字符(并将它们保存在磁盘上)。一个串口?您可以在上面写字符(并将它们传输到另一台计算机)。打印机?您可以在上面写字(并将它们打印在纸上)。

在大多数情况下,您的代码不想处理这些外围设备中的每一个在幕后如何实际工作或其特定接口的黑暗细节,您只想将一些字符写入一些外部定义的外围设备;您的日志格式可能与您在控制台、文件上打印数据或通过网络发送数据这一事实无关。这就是“流抽象”有用的地方。

input 流也一样,不同的是你可以读取个字符)

当然,当您需要利用每个设备的特殊性时,流抽象会变得不那么有用,甚至会妨碍您。如果我需要在屏幕或打印机上显示图形,则诸如一系列纯文本字符之类的表示不会削减它。

【讨论】:

  • 写得很好,+1。鉴于 OP 提到了监视器,您可能需要提及控制台库,例如 ncurses
  • @Matteo Italia 但是在 Cprogramming.com 上我得到了关于“流”的另一个定义:“流”在内部只不过是一系列字符。
  • @Matteo Italia 那么这是否意味着不同的上下文“流”意味着不同的东西?像一些更抽象的上下文和一些更具体的“一系列字符”?
  • @Matteo Italia 无论如何感谢您的努力!我明白你的意思:-)
  • @Des1gnWizard:“流”的确切含义取决于上下文,但通常它指的是一些抽象的东西,可以放置或接收字符。关键是它是abstract(即它是一个接口,隐藏了底层设备的细节)并且它只处理具有某些已定义顺序的characters。上面的解释是为了更清楚地说明这个抽象来自哪里以及为什么有用。
【解决方案2】:

一般来说,流是表示可以被认为是字符流的东西的对象。打开文件、标准输出、标准输入等等。

“监视器”没有流,因为没有人能说出您的“监视器”在特定硬件配置和特定环境下能做什么。

但是,有“标准输入”(cin)、“标准输出”(cout) 和cerr 之类的东西。这些流为您的应用程序和外部世界之间提供了一种简单而标准的通信方式,特别是对于在控制台中运行并可以输入和输出文本的所谓控制台应用程序。但即使是控制台应用程序仍然可以使用重定向的标准 I/O 流运行,而是读取和写入文件(或其他东西)。这就是为什么 C++ 标准没有说明这些流对应什么:对应取决于环境。

最后,cin/cout/cerr 接口只允许您做非常基本的事情。您的程序与外部世界之间的所有高级通信也是依赖于环境的,通常需要您使用特殊的库(例如,实现 GUI)。

【讨论】:

  • 感谢您的简单解释!我想我可能过度理解“流是字符的来源/目的地”,因为我对理解你的话没有任何困难。感谢您的努力!
【解决方案3】:

流是外部设备的接口。当您调用流函数时,它会触发下面的一些 sw 来处理设备,即像驱动程序一样。

您无需担心该软件中发生了什么 - 您只需要了解流接口即可。此级别抽象非常方便,因为您的代码独立于确切的外部设备。其他人写了 sw 这使得,例如无论操作系统、磁盘类型和监视器类型等如何,控制台 io、文件 io 等在您的代码中看起来都是一样的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 2010-11-12
    • 2022-07-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2011-08-19
    • 2013-07-15
    相关资源
    最近更新 更多