流和文件有啥区别?

Posted

技术标签:

【中文标题】流和文件有啥区别?【英文标题】:What is the difference between a stream and a file?流和文件有什么区别? 【发布时间】:2014-01-23 03:04:09 【问题描述】:

C 标准讨论了流。例如fopen(3) 手册页告诉fopen 是一个流打开函数

谁能解释一下到底是什么,以及它们与文件有何关系?

【问题讨论】:

到目前为止你的理解是什么?你想过用谷歌吗? 您能提供该引用的上下文吗?目前尚不清楚它指的是什么;如果您在一本书中阅读它,更多的上下文可能会帮助我们更好地阐明它。 并非所有文件都具有相同的功能。例如,磁盘文件可以支持随机访问,而某些打印机则不能。 在“你的意思...”的上下文中,“你”是谁? 【参考方案1】:

在 C 标准库的上下文中,流是用于执行某些 I/O 操作的通用接口。您可以从流中读取,写入流,某些流是可搜索的。将文件作为流打开只是将流作为应用程序的 I/O 接口的一种方法。

Let me quote:

11.1.1 流和文件描述符

当您想要对文件进行输入或输出时,您可以选择两种基本机制来表示程序与文件之间的连接:文件描述符和流。文件描述符表示为int 类型的对象,而流表示为FILE * 对象。

文件描述符为输入和输出操作提供了一个原始的低级接口。文件描述符和流都可以表示与设备(例如终端)的连接,或用于与另一个进程通信的管道或套接字,以及普通文件。 [...]

... and further:

12.1 流

由于历史原因,表示流的 C 数据结构的类型称为FILE 而不是“流”。由于大多数库函数都处理FILE * 类型的对象,因此有时术语文件指针 也用于表示“流”。这导致许多关于 C 的书籍中的术语令人遗憾地混淆。

C 中的 I/O 流示例:

标准流: https://linux.die.net/man/3/stdin 文件流: https://linux.die.net/man/3/fopen 管道: https://linux.die.net/man/3/popen 流套接字: https://linux.die.net/man/2/socket

如需进一步阅读,请查看以下链接:

https://www.gnu.org/software/libc/manual/html_mono/libc.html#I_002fO-Overview https://www.gnu.org/software/libc/manual/html_mono/libc.html#I_002fO-on-Streams

基于流的 API 建立在低级 文件描述符 API 之上,并提供额外的功能。然而,一些低级功能只能通过低级 API 使用,例如,内存映射 I/O非阻塞 I/O 或“事件驱动”输入/输出:

https://www.gnu.org/software/libc/manual/html_node/Memory_002dmapped-I_002fO.html https://linux.die.net/man/2/poll https://linux.die.net/man/4/epoll

【讨论】:

以上是关于流和文件有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

数据输入/输出流和缓冲输入/输出流有啥区别?

HTTP 流和服务器发送的事件有啥区别?

Flutter 中的 Sink 和 Stream 有啥区别?

内存流和文件流的区别

java里字符流 字节流和序列化的区别?

字符流和字节流的区别