C 中的文件流和 C++ 中的 iostream 有什么区别?

What's the difference between File stream in C and iostream in C++?

提问人:MainID 提问时间:3/18/2009 更新时间:9/30/2015 访问量:4972

问:

C 中的文件(文件*指针)流和 C++ 中的 iostream 有什么区别?

为什么它们都叫流,它们有什么共同点吗?

C++ C 编程语言

评论


答:

9赞 MattJ 3/18/2009 #1

它们都处理文件,而“流”只是一个非常笼统的术语,指的是来自某个来源的数据。

区别主要在于 C++ 的 iostream 对象是类/对象,C 文件数据是通过定义的 f*() 函数访问的。

所以基本上,相同的任务,不同的界面风格。

5赞 unwind 3/18/2009 #2

它们通常都是缓冲的,这意味着您在流上执行的 I/O 与在基础系统对象(例如文件)上执行的 I/O 不匹配 1:1。

例如,读取 2 个字节的调用可能会尝试从文件中读取 1,024 个字节,如果您接近文件末尾,则可能只返回 57。流实现将返回 2 个字节,并记住其缓冲区中还有 55 个字节。因此,它将满足下一个读取请求,而不会达到文件级别。fread()

编辑:值得指出的是,两种语言(分别为和)的默认错误流都没有缓冲。这是一个巨大的胜利,因为它增加了及时输出的机会。当通过在代码中加入语句来追逐奇怪的崩溃错误时,出于这个特殊原因,打印到错误流是一个非常好的主意。stderrcerrprintf()

评论

1赞 David Thornley 3/18/2009
流不一定是缓冲的;如果必须的话,stderr 和 cerr 将失去很多功能。流的概念是它是一个无差别字节序列,缓冲更像是一种实现或操作系统的东西。
0赞 Invictus 9/30/2015
我看到您的陈述“例如,读取 2 个字节的 fread() 调用可以从文件中读取 1024 个字节,如果您接近文件末尾,则可能只返回 57。这是否意味着一个 fread 可以继续阅读并超越 EoF ?
0赞 unwind 9/30/2015
@Invictus不,当然不是(文件系统不允许),它将截断 EOF 的读取。我会编辑的。谢谢。
2赞 bayda 3/18/2009 #3

两者都是操作系统 I/O 子系统的不同接口。

评论

0赞 3/18/2009
“系统实体”是什么意思?
0赞 bayda 3/18/2009
我的意思是操作系统的输入/输出子系统。
-1赞 t.g. 3/18/2009 #4

分辨它们的熟悉程度比区分它们更容易,因为他们只有一个熟悉度:它们都带有一个在编程世界中很常见的术语(流)。

stream 通常用于指代未格式化的原始数据,这些原始数据只是二进制字节的块。想想复制到新分配的内存中的文件内容,在它们被解析之前(即它们被复制后的那一刻),它们对你来说只是一块二进制字节。因此,您只有像 seek() 这样的方法来访问它们,它基于字节工作。

将其与可以 ReadLine()、WriteLine() 的文本文件进行比较,这些文本文件在预格式化实体(在本例中称为行)中工作。你会明白的。

1赞 Ferruccio 3/18/2009 #5

C++ 流可以通过两种方式进行扩展,而 C 文件则不能:

  • 您可以创建自己的流类型 所有可流式处理的对象都将 自动使用它。
  • 如果为某个类定义了流运算符,则可以写入和读取该类的任何对象 来自任何流。
0赞 Farshid 8/25/2009 #6

比较 C 和 Java 之间的文件流