2012-02-20 60 views
0

我刚刚运行了一些C++代码,它使用FILE *来使用“f”函数(fopen,fseek,fread等)来处理文件流。我相信这些是由标准头文件cstdio提供的。通过FILE处理流*

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

+0

这是非常主观的。流类不完全是C++最好的时刻。但唯一重要的是你的团队已经标准化了。如果你是一个团队,那么你可以选择。 – 2012-02-20 17:53:00

+0

因为我一个人工作,所以我有选择。我没有看到太多的C代码,所以我不认识它。 – user974967 2012-02-20 18:02:18

回答

2

他们在C兼容性,虽然没有什么能阻止你在现代C++程序中使用它们。

有些人往往喜欢ç流,因为他们要么不喜欢C++流(这可以说是在许多方面相当混乱),或他们认为的C流更快。最后一点在几年前的许多实现中都是有效的,但在现代实现中,C++流通常会更快一些(这种说法基于我在g ++,YMMV上做的一些基准)。

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

+0

据我所知,我从一开始就学会了C++,从未使用过C流,所以很难比较。根据我看到的答案,似乎我可能会更好地坚持ifstream。 – user974967 2012-02-20 18:04:21

1

AFAIK,在C++中,正确的方法是使用ifstream的cstdio,正如其名称所示,仅用于C兼容性。

两者都是正确的。

0

在C++中,您通常更喜欢使用流。将文件切换到网络流(或任何其他类型的流)时使生活更轻松一点。

cstdio是,如上所述,男子气概的C-兼容性也路径直接访问并仍然经常在代码中发现,人们不喜欢流的开销。

1

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

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

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

一些有效点存在使用cstdio虽然。大多数的iostream实现 是性能慢于cstdio明智且有进行了测试, 表明,coutprintf慢。

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