【发布时间】:2010-10-14 01:19:02
【问题描述】:
C 中的 File (File* pointer)stream 和 C++ 中的 iostream 有什么区别?
为什么都叫stream,有什么共同点吗?
【问题讨论】:
标签: c++ c programming-languages stream
C 中的 File (File* pointer)stream 和 C++ 中的 iostream 有什么区别?
为什么都叫stream,有什么共同点吗?
【问题讨论】:
标签: c++ c programming-languages stream
它们都处理文件,“流”只是一个非常笼统的术语,表示来自某个来源的数据片段。
区别主要在于C++的iostream对象是类/对象,C文件数据是通过定义的f*()函数来访问的。
所以基本上,相同的任务,不同的界面风格。
【讨论】:
它们通常都是缓冲的,这意味着您在流上执行的 I/O 与在底层系统对象(例如文件)上执行的 I/O 不匹配 1:1。
例如,读取 2 个字节的 fread() 调用可能会尝试从文件中读取 1,024 个字节,如果您接近文件末尾,则可能只会返回 57。差异都被流实现隐藏了,它将返回 2 个字节并记住它的缓冲区中还有 55 个字节。因此,它将满足下一个读取请求,而不会达到文件级别。
编辑:值得指出的是,两种语言的默认错误流(分别为stderr 和cerr)都没有缓冲。这是一个巨大的胜利,因为它增加了及时输出的机会。当通过使用printf() 语句散布代码来追踪奇怪的崩溃错误时,出于这个特殊原因,打印到错误流是一个非常好的主意。
【讨论】:
两者都是 OS I/O 子系统的不同接口。
【讨论】:
说他们的熟悉比区别更容易,因为他们只有一个熟悉:他们都有一个在编程世界中很常见的术语(流)。
stream 通常用于指代未格式化的原始数据,它们只是一大块二进制字节。想想复制到新分配内存的文件内容,在它们被解析之前(即它们被复制后的那一刻),它们对你来说只是一大块二进制字节。所以你只有像 seek() 这样的方法来访问它们,它基于字节工作。
将其与您可以 ReadLine()、WriteLine() 的文本文件进行比较,它们在预格式化实体(在本例中称为行)中工作。你会明白的。
【讨论】:
C++ 流可通过两种 C 文件不可扩展的方式进行扩展:
【讨论】:
比较 C 和 Java 之间的文件流
【讨论】: