我刚刚遇到一些C ++代码,它使用FILE *来使用“f”函数(fopen,fseek,fread等)来操作文件流。我相信这些是由标准头cstdio提供的。
这在现代C ++代码中被认为是过时的或不好的做法吗?我问,因为我也看到你可以使用setg和tellg来获取/设置ifstream对象流的位置,我想知道这样做的优点是什么。这是一个“老习惯难死”C程序员操纵流的方式还是在现代C ++代码中使用FILE *和“f”函数仍然有正当理由?
答案 0 :(得分:2)
它们用于C兼容性,尽管没有什么可以阻止您在现代C ++程序中使用它们。
有些人倾向于喜欢C流,因为他们不喜欢C ++流(在许多方面可能相当混乱),或者他们认为C流更快。最后一点在几年前的许多实现中都是有效的,但在现代实现中,C ++流通常会更快一些(这个陈述基于我在g ++,YMMV上做的一些基准测试)。
但是,C流有一个重要的问题:因为它们是C的东西并且没有按类来实现,所以在将它们与异常一起使用时必须格外小心,否则你可能会泄漏文件句柄;此问题与C ++文件流无关,因为它们封装在类中,当异常导致堆栈展开时会调用析构函数,因此会阻止文件句柄泄漏。
答案 1 :(得分:1)
AFAIK,在C ++中,正确的方法是使用 ifstream 。 cstdio ,正如其名称所示,仅用于C兼容性。
两者都是正确的。
答案 2 :(得分:1)
对于C ++,在大多数情况下应该使用 iostream 库。
iostream库以一般方式输出和输出,并提供 类型安全,并且比 cstdio 更不容易出错。还有 iostream 库提供了可扩展性,允许您继承和重载 除了标准类型之外,您自己的类型也是可流动的。
但有些人认为 iostream 库是 过于冗长,也有一些使用 cstdio 库,因为它是最熟悉的 他们。
虽然存在使用 cstdio 的一些有效点。大多数 iostream 实现
性能比 cstdio 慢,并且进行了测试
表明cout
比printf
慢。
因此,如果速度至关重要,或者它是混合的c ++和c代码库,则可能是一个 选择 cstdio 库的论据。否则,c ++的标准io是 的iostream
答案 3 :(得分:0)
在c ++中,您通常更喜欢在流上操作。将文件切换到网络流(或任何其他类型的流)时,可以使生活更轻松。
如上所述,cstdio是c-compatibility的男子气概,但也是直接访问的路径,并且仍然经常在人们不喜欢流的开销的代码中找到。