通过 FILE* 操作流
manipulating a stream via FILE*
我刚刚遇到了一些使用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++中,正确的方法是使用 ifstream。cstdio,顾名思义,仅用于C兼容性。
不过两者都是正确的。
对于C++,在大多数情况下应该使用 iostream 库。
iostream 库以一般方式提供和输出,并提供类型安全,比CSTDIO更不容易出错。还有 iostream库提供可扩展性,允许您继承和重载以除了标准类型之外,您自己的类型可流式传输。
然而,有些人认为iostream库是过于冗长,有些人也使用 CSTDIO 库,因为它最熟悉给他们。
不过,存在一些使用 cstdio 的有效点。大多数 iostream 实现在性能方面比CSTDIO慢,并且已经进行了测试表明cout
比printf
慢。
因此,如果速度至关重要,或者它是 c++ 和 c 代码库的混合,那可能是一个选择CSTDIO库的论据。否则,c++ 的标准 io 为艾欧流
在 c++ 中,您通常更喜欢对流进行操作。使将文件切换到网络流(或任何其他类型的流(时更轻松一些。
如前所述,CSTDIO 对于 C 兼容性来说是男子气概的,但也是直接访问的路径,并且仍然经常出现在人们不喜欢流开销的代码中。
- 为什么在popback()操作之后,它仍然打印完整的矢量
- Seg Fault Issue C++ (file IO / getline)
- 重载操作程序时出错>>用于类中的字符串 memebr
- 对字符串进行位操作
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 为什么一个向量上的多线程操作很慢
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 位移操作和位掩码未检测到重复字符
- 如何进行特定的位操作?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 字符串操作 - 字符计数
- 此代码中的操作流程是什么?C/C++.
- 使用istream和FILE*操作的getline的性能差异
- 通过 FILE* 操作流