【问题标题】:manipulating a stream via FILE*通过 FILE* 操作流
【发布时间】:2012-02-20 17:44:00
【问题描述】:

我刚刚遇到了一些 C++ 代码,这些代码使用 FILE* 来使用“f”函数(fopen、fseek、fread 等)来操作文件流。我相信这些是由标准头文件 cstdio 提供的。

这在现代 C++ 代码中是否被认为是过时或糟糕的做法?我问是因为我还看到您可以使用 setg 和 tellg 获取/设置 ifstream 对象的流的位置,我想知道这样做的好处是什么。这是 C 程序员处理流的“旧习惯难改”,还是仍有正当理由在现代 C++ 代码中使用 FILE* 和“f”函数?

【问题讨论】:

  • 这是非常主观的。流类并不是 C++ 最好的时刻。但唯一重要的是你的团队已经标准化了。如果您是一个人的团队,那么您可以选择。
  • 我确实有一个选择,因为我是一个人工作。没看过太多C代码所以没认出来。

标签: c++


【解决方案1】:

它们的存在是为了与 C 兼容,尽管没有什么能阻止您在现代 C++ 程序中使用它们。

有些人倾向于喜欢 C 流,因为他们不喜欢 C++ 流(可以说在许多方面都相当混乱),或者他们认为 C 流更快。最后一点在几年前的许多实现中都是有效的,但在现代实现中,C++ 流通常会更快一些(这个陈述基于我在 g++、YMMV 上所做的一些基准测试)。

不过,C 流还有一个重要问题:因为它们是 C 的东西并且不是根据类实现的,所以在将它们与异常一起使用时必须格外小心,否则可能会泄漏文件句柄;这个问题与 C++ 文件流无关,因为它们被封装在类中,当异常导致堆栈展开时会调用其析构函数,因此可以防止文件句柄泄漏。

【讨论】:

  • 我从一开始就学习 C++,据我所知从未使用过 C 流,因此很难比较。根据我看到的答案,似乎我最好还是坚持使用 ifstream。
【解决方案2】:

AFAIK,在 C++ 中,正确的方法是使用 ifstream。顾名思义,cstdio 仅用于 C 兼容性。

虽然两者都是正确的。

【讨论】:

    【解决方案3】:

    对于 C++,iostream 库应该在大多数情况下使用。

    iostream 库以一般方式给出输入和输出,并提供 类型安全并且比 cstdio 更不容易出错。还有 iostream 库提供可扩展性,允许您继承和重载 除了标准类型之外,您还可以流式传输您自己的类型。

    然而,有些人认为 iostream 库是 过于冗长,也有些人使用 cstdio 库,因为它是最熟悉的 给他们。

    虽然存在一些使用 cstdio 的有效点。大多数 iostream 实现 在性能方面比 cstdio 慢,并且已经进行了测试 表明 coutprintf 慢。

    因此,如果速度很关键,或者它是混合的 c++ 和 c 代码库,那可能是 选择 cstdio 库的参数。否则 c++ 的标准 io 是 iostream

    【讨论】:

      【解决方案4】:

      在 c++ 中,您通常更喜欢对流进行操作。将文件切换到网络流(或任何其他类型的流)时让生活变得更轻松。

      如前所述,cstdio 是男子气概的 c 兼容性,但也是直接访问的路径,并且仍然经常在人们不喜欢流开销的代码中找到。

      【讨论】:

        猜你喜欢
        • 2018-09-20
        • 2011-09-29
        • 2016-03-10
        • 1970-01-01
        • 2013-06-16
        • 2021-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多