C ++和C文件I / O.

时间:2009-03-03 10:10:15

标签: c++ file io

C ++文件I / O比C文件I / O更难。 那么在C ++中,为文件I / O创建一个新库是否有用?我的意思是<fstream> 任何人都可以告诉C ++文件I / O有什么好处吗?

9 个答案:

答案 0 :(得分:14)

<强>意见

我不知道任何使用C ++流的真实项目。它们太慢而且难以使用。有几个较新的库,如FastFormatBoost版本声称更好,在最后一个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就是那个库,只有时间会证明。

戴夫

答案 1 :(得分:7)

对我来说,消除缓冲区溢出似乎是C ++的一大胜利。

答案 2 :(得分:6)

请看一下

http://www.ddj.com/cpp/184403651

那么你会比C I / O更喜欢C ++ I / O.

简而言之,如果您知道读取或写入之前的数据大小以及速度,则首选C. 如果您不了解数据大小和高效代码,则首选C ++。

答案 3 :(得分:6)

为了回应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,具体取决于实现方式。和其他外部因素。

答案 4 :(得分:2)

printf()/ fwrite样式I / O和C ++ IO流格式之间的性能差异非常依赖于实现。一些实现(例如,可视化C ++),在FILE *对象之上构建其IO流,这往往会增加其实现的运行时复杂性。但请注意,以这种方式实现库没有特别的限制。

在我看来,C ++ I / O的好处如下:

  • 如前所述,类型安全。
  • 实施的灵活性。可以编写代码以执行特定格式化或输入到通用ostream或istream对象或从通用ostream或istream对象输入。然后,应用程序可以使用任何类型的派生流对象调用此代码。如果我现在需要将针对文件编写和测试的代码应用于套接字,串行端口或其他类型的内部流,则可以创建特定于该类I / O的流实现。以这种方式扩展C样式I / O甚至不可能。
  • 区域设置的灵活性:在我看来,使用单一全局区域设置的C方法存在严重缺陷。我遇到过我调用库代码(DLL)的情况,它改变了代码下面的全局语言环境设置并完全弄乱了我的输出。 C ++流允许您将任何语言环境灌输给流对象。

答案 5 :(得分:1)

std :: ifstream和std :: ofstream已经在stl库中。您不必创建自己的。

主要好处是所有输出和输入都是类型安全。

答案 6 :(得分:1)

C和C ++是两种不同的语言。 C ++文件io需要一些时间来习惯,但是一旦你使用算法,例外等,它们往往很自然地落到位。

答案 7 :(得分:1)

每当我需要在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容易。

答案 8 :(得分:0)

很多。缺点也是。有关详细信息,请参阅C ++语言FAQ。简而言之:类型安全和用户定义类型。