题
C++文件I/O比C文件I/O.因此,在C++、创建一个新的图书馆为文件I/O是有用的,或没有?我的意思是 <fstream>
任何人都可以请告诉是否有任何好处在C++文件I/O?
解决方案
<强>意见强>
我不知道任何使用C ++流的真实项目。它们太慢而且难以使用。有几个较新的库,如 FastFormat 和 Boost 版本声称更好,有一篇关于他们的ACCU Overload杂志。我个人在C ++过去15年左右使用过c FILE库,我认为没有理由改变。
<强>速度强>
这是一个小测试程序(我快速敲打)以显示基本的速度问题:
#include <stdio.h>
#include <time.h>
#include<iostream>
#include<fstream>
using namespace std;
int main( int argc, const char* argv[] )
{
const int max = 1000000;
const char* teststr = "example";
int start = time(0);
FILE* file = fopen( "example1", "w" );
for( int i = 0; i < max; i++ )
{
fprintf( file, "%s:%d\n", teststr, i );
}
fclose( file );
int end = time(0);
printf( "C FILE: %ds\n", end-start );
start = time(0);
ofstream outdata;
outdata.open("example2.dat");
for( int i = 0; i < max; i++ )
{
outdata << teststr << ":" << i << endl;
}
outdata.close();
end = time(0);
printf( "C++ Streams: %ds\n", end-start );
return 0;
}
我的电脑上的结果:
C FILE: 5s
C++ Streams: 260s
Process returned 0 (0x0) execution time : 265.282 s
Press any key to continue.
正如我们所看到的,这个简单的例子慢了52倍。我希望有办法让它更快!
注意:在我的示例中将endl更改为'\ n'改进了C ++流,使其仅比FILE *流慢3倍(感谢 jalf )可能有办法让它更快。
难以使用
我不能说printf()不简洁,但是一旦你超过宏代码的初始WTF,它就更灵活(IMO)并且更容易理解。
double pi = 3.14285714;
cout << "pi = " << setprecision(5) << pi << '\n';
printf( "%.5f\n", pi );
cout << "pi = " << fixed << showpos << setprecision(3) << pi << '\n';
printf( "%+.3f\n", pi );
cout << "pi = " << scientific << noshowpos << pi<< '\n';
printf( "%e\n", pi );
问题
是的,可能需要一个更好的C ++库,很多是 FastFormat 就是那个库,只有时间会证明。
戴夫
其他提示
对我来说,消除缓冲区溢出似乎是C ++的一大胜利。
请看一下
http://www.ddj.com/cpp/184403651
那么你会比C I / O更喜欢C ++ I / O.
简而言之,如果您知道读取或写入之前的数据大小以及速度,则首选C. 如果您不了解数据大小和高效代码,则首选C ++。
为了回应David Allan Finch的回答,我在他的基准测试代码中修复了一个错误(他在每一行之后刷新了C ++版本的流),并重新进行了测试:
C ++循环现在看起来像这样:
start = time(0);
{
ofstream outdata("example2.txt");
for( int i = 0; i < max; i++ )
{
outdata << teststr << ":" << i << "\n"; // note, \n instead of endl
}
}
end = time(0);
我运行了10000000次迭代(比原始代码多10倍,因为否则,这些数字对于time()来说太小了,不能给我们任何有意义的分辨率)) 输出是:
G++ 4.1.2:
C FILE: 4s
C++ Streams: 6s
MSVC9.0:
C FILE: 10s
C++ Streams: 23s
(请注意,MSVC版本在我的笔记本电脑上运行,硬盘速度明显较慢)
但这给我们的性能差异为1.5-2.3x,具体取决于实现方式。和其他外部因素。
业绩之间的差异printf()/fwrite式I/O、C++IO流格式都非常依赖于实现。一些实现(C++为实例),建立自己的IO流上的文件*的对象,这往往会增加运行时的复杂性,其执行情况。然而,请注意,有没有特别约束,以实现图书馆在这种时尚。
在我自己的意见,C++I/O如下:
- 类安全正如已经指出的那样更早。
- 灵活的执行情况。代码可以是书面要做的具体格式或输入或从一般ostream或istream对象。该应用程序后可以援引该法与任何种类的衍生流的对象。如果代码,我已经写和测试对一个文件现在需要施加一个插座,一串口,或者一些其他类型的内部流,您可以创建一个流的执行情况特有的那种I/O.延伸C式I/O以这种方式是不可能的。
- 灵活性的区域设置:C办法使用一个单一的全球性语言环境,在我看来,严重缺陷。我已经经历的情况下,我援引图书馆的代码(a DLL)改变了的全球区域设置下我的代码和完全搞砸了我的输出。C++流允许你灌输()任何地区一流的对象。
std :: ifstream和std :: ofstream已经在stl库中。您不必创建自己的。
主要好处是所有输出和输入都是类型安全。
C和C ++是两种不同的语言。 C ++文件io需要一些时间来习惯,但是一旦你使用算法,例外等,它们往往很自然地落到位。
每当我需要在C ++文件中输入/输出输出时,我只使用两行。
freopen("input.txt","r",stdin); // for input from file
freopen("output.txt","w",stdout);// for output from file
现在您可以像通常从控制台那样扫描变量,而输出的任何内容都将显示在output.txt文件中。
所以我不认为c ++中的文件I / O很难,它比c更容易。
很多。缺点也是。有关详细信息,请参阅C ++语言FAQ。简而言之:类型安全和用户定义类型。