【问题标题】:What's the difference between File stream in C and iostream in C++?C 中的文件流和 C++ 中的 iostream 有什么区别?
【发布时间】:2010-10-14 01:19:02
【问题描述】:

C 中的 File (File* pointer)stream 和 C++ 中的 iostream 有什么区别?

为什么都叫stream,有什么共同点吗?

【问题讨论】:

    标签: c++ c programming-languages stream


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 流不一定是缓冲的;如果必须,stderr 和 cerr 会失去很多功能。流的想法是它是一个未区分的字节序列,缓冲更多的是一种实现或操作系统。
      • 我看到您的声明“例如,读取 2 个字节的 fread() 调用可以从文件中读取 1024 个字节,如果您接近文件末尾,则可能只返回 57。”这是否意味着 fread 可以继续阅读并超越 EoF ?
      • @Invictus Nah,当然不是(文件系统不允许),它会在 EOF 处截断读取。我会编辑。谢谢。
      【解决方案3】:

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

      【讨论】:

      • “系统实体”是什么意思?
      • 我的意思是操作系统的输入/输出子系统。
      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        C++ 流可通过两种 C 文件不可扩展的方式进行扩展:

        • 您可以创建自己的流类型 并且所有可流式传输的对象都将 自动使用它。
        • 如果为类定义了流操作符,则该类的任何对象都可以读写 来自任何信息流。

        【讨论】:

          【解决方案6】:

          比较 C 和 Java 之间的文件流

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-09-09
            • 2011-10-18
            • 1970-01-01
            • 2014-03-01
            • 2017-08-22
            • 2017-10-08
            • 1970-01-01
            相关资源
            最近更新 更多