通过 FILE* 操作流

manipulating a stream via FILE*

本文关键字:操作 FILE 通过      更新时间:2023-10-16

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

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

它们

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

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

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

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

不过两者都是正确的。

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

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

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

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

因此,如果速度至关重要,或者它是 c++ 和 c 代码库的混合,那可能是一个选择CSTDIO库的论据。否则,c++ 的标准 io 为艾欧流

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

如前所述,CSTDIO 对于 C 兼容性来说是男子气概的,但也是直接访问的路径,并且仍然经常出现在人们不喜欢流开销的代码中。