当前位置:  开发笔记 > 编程语言 > 正文

C++和C文件I/O.

如何解决《C++和C文件I/O.》经验,为你挑选了4个好方法。

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



1> David Allan ..:

意见

我不知道任何使用C++流的真实项目.它们太慢而且难以使用.有一些较新的库,如FastFormat和Boost版本声称更好,有一篇关于它们的ACCU Overload杂志.我个人在C++中使用过去15年左右的c FILE库,我看不出有任何改变的理由.

速度

这是一个小测试程序(我快速敲一下)来显示基本的速度问题:

#include 
#include 

#include
#include

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和C++版本不做同样的事情.c ++版本在每一行(endl)之后刷新缓冲区.有时,阅读您使用的代码的文档是一个好主意.
调用printf更灵活也是无稽之谈.它不适用于用户定义的类型.这几乎不灵活.它比iostream灵活得多*灵活.我认为C++版本更容易理解.我可以猜到setprecision的作用.%+.3不太明显.
std :: endl比简单地插入换行符要慢,因为std :: endl被定义为同时刷新流.
@David:我现在意识到这已经不久了......但是我刚刚运行了上面的测试程序(没有endl)并获得了非常可比的结果.在调试模式下,我得到了类似的结果,但在VC2010的发布模式下,我获得了与C和C++相同的结果.我可以问你最初是在调试还是发布时运行它?
对于输入和输出,C比C++更快.http://cybertiggyr.com/ios0/index.html

2> 小智..:

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



3> lakshmanaraj..:

请看看

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

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

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



4> jalf..:

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

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有