I/O流与外部设备有什么关系?

4

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

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

那么"流是字符的来源/目标"是什么意思呢? 以显示器为例,字符的目标不应该是显示器而不是流吗?还是说我可以把显示器看作是一个流?如果是这样的话,那么如何理解下面的内容:

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

认为cout、cerr和clog是显示器的对象太奇怪了... 我宁愿将输出流视为与显示器不同的对象。

能否有人简单地解释一下I/O流与外部设备之间的真正连接以及其工作原理?非常感谢!


你正在寻找的连接是依赖于实现的,iostreams 是一种应该抽象化的东西。在 Linux 和其他 Unix 操作系统上,我曾经看到过 iostream 变种连接到网络套接字(2003 年左右的 gcc 扩展),以及更常见的 I/O 通道,如终端和普通的 UTF-8/8859-1 文本文件。 - Erik Alapää
3个回答

4

流是一种对各种设备的抽象,这些设备有一个共同点,即您可以在其中写入字符。具体实现取决于操作系统(尽管在现代操作系统中,C++流会包装操作系统提供的流)。

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

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

(相同的方法适用于输入流,其区别在于您可以读取字符)

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


写得很好,点赞。鉴于OP提到了监视器,您可能需要提及控制台库,如“ncurses”。 - Angew is no longer proud of SO
@Matteo Italia 但是在Cprogramming.com上,我找到了另一个关于“流”的定义:'流'在内部实际上只是一系列字符。 - Des1gnWizard
@Matteo Italia 那么这是否意味着不同的上下文中,“流”有不同的含义?比如有些上下文更抽象,而有些则更具体,比如“一系列字符”? - Des1gnWizard
@Matteo Italia,无论如何感谢你的努力!我明白你的意思了 :-) - Des1gnWizard
@Des1gnWizard: "流"的确切含义取决于上下文,但通常它指的是一些抽象的东西,可以放置或获取字符。关键点在于它是抽象的(即它是一个接口,隐藏了底层设备的细节),并且它只处理具有某些定义顺序的字符。上面的解释是为了更清楚地说明这种抽象来自哪里以及为什么它很有用。 - Matteo Italia
@MatteoItalia 是的,关键是“它是抽象的”。我终于“大体上”明白了! - Des1gnWizard

2

流(stream)是一种表示字符流的对象。它可以代表打开的文件、标准输出和标准输入等等。

没有针对“显示器”(monitor)的流,因为无法预知在某些硬件配置和环境下显示器的工作方式。

但是,存在“标准输入”(cin)、“标准输出”(cout) 和 cerr等流。这些流提供了一个简单且标准的方法,以便应用程序与外部世界进行通信,特别是针对所谓的控制台应用程序,它们在控制台中运行并可以输入和输出文本。但即使控制台应用程序也可能在重定向标准I/O流的情况下运行,从而读取或写入文件(或其他内容)。这就是为什么C++标准没有明确规定这些流对应的是什么:这种对应关系取决于环境。

最后,cin/cout/cerr接口只能实现非常基础的功能。所有高级的程序与外部世界之间的通信也依赖于具体的环境,并且通常需要使用特殊的库(例如实现GUI)。


感谢您清晰的解释!我觉得可能我过于理解“流是字符的源/目标”,因为我没有感到理解您的话有任何困难。谢谢您的努力! - Des1gnWizard

0

流是与外部设备交互的接口。当您调用流函数时,它会触发一些底层软件来处理设备,就像驱动程序一样。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接