C语言中的文件流与C++中的iostream有什么区别?

3

在C语言中,File(文件*指针)流和C++中的iostream有何区别?

它们为什么都被称为流,它们是否有共同之处?

6个回答

9
他们都处理文件,“stream”只是一个非常通用的术语,用于描述来自某些源的分段数据。
主要区别在于C++的iostream对象是类/对象,而C文件数据通过定义的f *()函数访问。
因此,基本上是相同的任务,不同的接口风格。

5
它们通常都是缓冲的,这意味着您在流上执行的I/O与在底层系统对象(例如文件)上执行的I/O不是1:1匹配的。
例如,对于读取2个字节的fread()调用,可能尝试从文件中读取1024个字节,如果您接近文件末尾,则可能只返回57个字节。所有这些差异都被流实现隐藏起来,它将返回2个字节并记住其缓冲区中还有55个字节。因此,在不触及文件级别的情况下,它将满足下一个读取请求。
编辑:值得指出的是,两种语言中的默认错误流(分别为stderr和cerr)都没有缓冲区。这是一个很大的优势,因为它增加了及时获取输出的机会。当通过在代码中添加printf()语句来查找奇怪的崩溃错误时,出于这个特定原因,将打印到错误流是一个非常好的主意。

1
流并不一定是缓冲的;如果它们必须是缓冲的,stderr和cerr将失去很多功能。 流的理念是它是一个未经区分的字节序列,而缓冲更多的是一种实现或操作系统的东西。 - David Thornley
我看到你的陈述:“例如,一个fread()调用读取2个字节,可能会从文件中读取1024个字节,如果你接近文件结尾,它可能只返回57。”这是否意味着fread可以继续读取超出EoF的内容? - Invictus
@Invictus 不会的,当然不会(文件系统不允许),它会在EOF处截断读取。我会进行编辑。谢谢。 - unwind

2

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


“system entity” 是什么意思? - anon
我指的是操作系统的输入/输出子系统。 - bayda

1

C++ 流有两种扩展方式,而 C 文件没有:

  • 您可以创建自己的流类型,并且所有可流化的对象都会自动与其配合使用。
  • 如果为类定义了流运算符,则该类的任何对象都可以写入和读取任何流中。

0

比较C和Java之间的文件流


-1

告诉他们的熟悉程度比差异更容易,因为它们只有一个共同点:它们都有一个在编程世界中常见的术语(流)。

流通常用于指代未格式化的原始数据,它们只是一堆二进制字节。想象一下文件内容被复制到新分配的内存之前(即复制完成后的那一刻),对你来说它们只是一堆二进制字节。所以你只能使用像seek()这样基于字节的方法来访问它们。

相比之下,文本文件可以使用ReadLine()、WriteLine()等方法,这些方法适用于预格式化的实体(在这种情况下称为行)。你会明白的。


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