繁体   English   中英

通过FILE *处理流

[英]manipulating a stream via FILE*

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

在现代C ++代码中,这被认为是过时的还是不良的做法? 我问,是因为我也看到您可以使用setg和tellg获取/设置ifstream对象的流的位置,我想知道这样做的好处。 这是操纵流的“老习惯”吗,还是在现代C ++代码中使用FILE *和“ f”函数的正当理由?

它们在那里具有C兼容性,尽管没有什么阻止您在现代C ++程序中使用它们。

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

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

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

两者都是正确的。

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

iostream库以通用方式输出和输出,并提供类型安全性,并且比cstdio少出错。 iostream库还提供了可扩展性,允许您继承和重载以使您自己的类型(除标准类型外)都可流式传输。

但是,有些人认为iostream库过于冗长,还有一些人使用cstdio库,因为他们最熟悉它。

存在一些使用cstdio的有效点。 大多数iostream实现在性能上都比cstdio慢,并且进行的测试表明, coutprintf慢。

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

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

如前所述,cstdio是c兼容的主要工具,也是直接访问的途径,并且仍然经常在人们不喜欢流开销的代码中找到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM