【问题标题】:What does 'stream' mean in C?C语言中的“流”是什么意思?
【发布时间】:2016-12-03 19:47:48
【问题描述】:

我正在阅读“C Primer Plus”中处理文件、流和键盘输入的部分。作者将流的概念与文件联系起来,定义流如下:

从概念上讲,C 程序处理流而不是直接处理文件。 流是实际输入或输出映射到的理想化数据流。这意味着具有不同属性的各种输入由具有更统一属性的流表示。打开文件的过程就变成了将流与文件关联起来,通过流进行读写

作者所说的粗体字是什么意思?文件和流之间的联系是什么?

【问题讨论】:

  • 从 Internet 上的各种其他来源搜索并阅读 C 中的文件流,即。 tutorialspoint.com等你会明白的。
  • 您已经用粗体字标记了答案。这正是它的本质。毕竟不是一个坏问题,但我怀疑它是否属于这里
  • 也许你可以想象它就像一个管道(输送水的管子)——一个数据可以通过它流入和流出的连接。
  • @BatCoder 你说的管道是什么意思?

标签: c file stream terminology


【解决方案1】:

设计 C 的人想要一种统一的方式来连接不同的顺序数据源,例如文件、套接字、键盘、USB 端口、打印机等等。

因此,他们设计了一个可以应用于所有人的界面。此接口使用所有这些接口共有的属性。

为了更容易谈论可以通过界面使用的东西,他们给了这些东西一个通用名称,streams

使用相同接口的好处在于,可以使用相同的代码从键盘或套接字读取文件。

【讨论】:

  • 流本质上是文件本身吗? (只是出于好奇)
  • 什么是文件?文件是一种抽象。它是内存中某处的地址,指示一系列字节中的第一个字节(如果它是一个大文件,它也可以被分段)。流也是写入字节和读取字节的内存位置。从这个意义上说,它就像一个文件,您可以从中写入和读取。但它们都是抽象的。它们只是内存偏移量,人们可以在其中读取和写入数据
【解决方案2】:

流是处理不同数据介质/源的C way。这些 可以包括说

  1. 一个文件
  2. 一个插座

等等。 stream 作为一个接口,可以帮助您忘记如何在后台管理数据并专注于期望的目标。

【讨论】:

    【解决方案3】:

    是代表文件设备的逻辑实体,可以接受输入或输出。标准 C 中的所有输入和输出函数都对数据流进行操作。流可以分为文本、流和二进制流。

    【讨论】:

      【解决方案4】:

      请注意,文件和流是完全不同的东西。文件只是字节序列,而流只是促进者(帮助者)。

      之所以出现流,是因为所有程序都需要以多种不同的形式与其周围环境进行交互(可以是文件,可以是 I/O 设备,例如显示器和键盘,也可以是网络套接字等)。

      所以流是一个界面(一个简单的“面孔”,可以处理与我们无关的许多微妙之处,就像我们不需要知道电视遥控器是如何工作的一样!) 用于触发数据的输入/输出流,从/到任何可能是该输入/输出数据的源/目标的东西,隐藏操作系统按顺序设计的众多方法的低级实现细节代表程序员与各种设计的硬件进行交互(即,我们——作为程序员——对每次创建新软件时重新编程操作系统与各种硬件交互的方式并不真正感兴趣)。

      例如,考虑我们的程序从键盘获取输入的方式......,这是怎么发生的?这是通过操作系统provides for every "process"的隐藏(对程序员隐藏)流发生的(一旦程序运行,它将是所谓的process),并且操作系统将地址提供给标准流自动处理它(即,我们不需要编写代码来定位它的地址)。此流通常称为“stdin”(源于 C 和 Unix 术语),或更正式地称为“标准输入流”。我们的程序,无论用什么语言编写,都必须能够使用操作系统通过该语言的标准 I/O 库生成的此类标准流。作为一个例子,在 C 编程语言中,我们可以通过调用函数“scanf”来扫描标准输入流(scanf 会自动知道我们程序的标准输入在哪里)。

      但是作为另一个重要的例子,还是在 C 中,假设这次我们的程序想要将用户的输入写入“文件”... 是否只有标准输入流的存在在这种情况下就够了吗?当然不是!这一次,我们需要使用一对流,一个已经由操作系统提供的stdin,来获取用户的输入,另一个,让我们的程序和文件进行通信!所以我们必须创建第二个流!可以通过调用the fopen() function 来完成。 (有趣的事实:在手册中,如果你注意到,你会看到这个函数的返回类型是一个指向名为 FILE 的结构的指针,但这只是一个传统的“bad choice of word”,实际上是一个指向“流”的指针"!是的,C 中的 FILE 类型确实是流,而不是文件!(我明白了,疯了!)所以请记住,指针 FILE* 不指向实际文件,它指向包含有关信息的流该文件,包括有关用于文件 I/O 的缓冲区的信息等)

      注意:我们自己创建的流(例如文件流)可以是双向,而标准流是单向。下图中的箭头也很好地说明了这一点:

      也作为C++世界中的一个例子给你比较,你知道在那里,东西在类而不是结构中,所以你会遇到一个对象 如果您正在输出,则称为“cout”(输出流对象),它是连接到输出流(C 中的标准输出)的对象,并且是类 ostream 的实例(来自类层次结构 ios_base printf())。这一次,cout 不足以与其他事物(例如文件)交互,我们需要创建自己的流。在 C++ 中,可以通过实例化 ifstream 和 ofstream 类(对应于 C 中的 FILE 结构)来实现,这将产生与 C 中的指针“FILE*”基本相同作用的对象。

      希望有帮助。


      插图归功于 linuxhint.com

      【讨论】:

      • @M-S 你明确提到了input from keyboard, how does that happen?stdout。为什么出来了?你接受输入。不应该是stdin 吗?
      • @JinLim 确定这是一个错误,感谢您提及,我现在已在编辑中修复它。
      【解决方案5】:

      如果有帮助,我的 C 编程学位使用了以下说明: “流是文件的抽象,它为程序员提供一致的接口,而不管实际设备如何。”

      【讨论】:

        【解决方案6】:

        一个流就是一个文件 * 像函数 C FILE * fopen ( const char * filename, const char * mode ) 这个函数返回一个文件 *

        文件:

        包含控制流的信息的对象 标识流并包含控制流所需信息的对象类型,包括指向其缓冲区的指针、位置指示器和所有状态指示器。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-14
          • 2020-10-30
          • 2020-08-07
          • 2011-09-02
          • 1970-01-01
          • 1970-01-01
          • 2011-08-27
          • 2015-11-16
          相关资源
          最近更新 更多