`
qimo601
  • 浏览: 3449644 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

fstream与 C 风格(例如fread 和 fwrite )两种读写文件方法的效率比较

阅读更多

 

我觉得作者写的挺好,评论也写的很对。

目前我的项目就是在VS2008+Qt+win7上开发的。我上次总结的QFile和C语言对文件操作的性能比较.--读取double型二进制数据文件也说明了这个问题。

在windows平台下,MSVC编译器的环境下,对大文件的数据读写操作。采用C语言的形式(例如fread  fwrite )确实比C++/QT的串行序列化读写文件,速度快上好几倍。可以参考这两篇文章。

1、QFile和C语言对文件操作的性能比较.--读取double型二进制数据文件

2、fstream与 C 风格(例如fread 和 fwrite )两种读写文件方法的效率比较

 

 

转载:

为了探录c++ 风格的fstream C 风格(例如fread  fwrite )两种读写文件的方法的效率,我特意做了两个实验。

我的机器是Windows XP, Visual Studio 2008

1. 测试写文件速度

程序设计思路: 将TEST_SIZE个字符用两种方式写入文件,记录两种方式的耗时。 

实验代码:

[cpp] view plaincopy

  1. void test_write()  
  2. {     
  3.     const int TEST_SIZE = 10000000 ;  
  4.     const char* c_plus_write_file = "H://c_plus_write_file.txt";  
  5.     const char* c_write_file = "H://c_write_file.txt";  
  6.       
  7.     cout<<"Test size :" << TEST_SIZE <<endl;  
  8.     //c++ style writing file  
  9.     ofstream of(c_plus_write_file);  
  10.     assert(of);  
  11.     time_t start, end;  
  12.     start =  clock();  
  13.     for(int i=0; i < TEST_SIZE; ++i)  
  14.     {  
  15.         char tmp[1];  
  16.         tmp[0] = char(i);  
  17.         of << tmp[0];  
  18.     }  
  19.     end = clock();  
  20.     of.close();  
  21.     cout<<"C++ style: "<<end - start <<" ms"<<endl;  
  22.     //c style writing file  
  23.     FILE* fp = fopen(c_write_file, "w");  
  24.     start =  clock();  
  25.     for(int i=0; i < TEST_SIZE; ++i)  
  26.     {  
  27.         char tmp[1];  
  28.         tmp[0] = char(i);  
  29.         fwrite( tmp, 1, 1, fp);  
  30.     }  
  31.     end = clock();  
  32.     fclose(fp);  
  33.     cout<<"C style: "<<end - start <<" ms"<<endl;  
  34.     cin.get();  
  35. }  
 

 

 

实验结果:

图1

图2

图3

 

**从图1、2、3,可以看出, ofstream 的 << 运算符 所耗时 是fwrite()的近三倍

 

 

of<<的代码改成了: of.write(tmp,1); 后结果:

 

 

实验代码:

  1. void test_write()  
  2. {     
  3.     const int TEST_SIZE = 1000000 ;  
  4.     const char* c_plus_write_file = "H://c_plus_write_file.txt";  
  5.     const char* c_write_file = "H://c_write_file.txt";  
  6.       
  7.     cout<<"Test size :" << TEST_SIZE <<endl;  
  8.     //c++ style writing file  
  9.     ofstream of(c_plus_write_file);  
  10.     assert(of);  
  11.     time_t start, end;  
  12.     start =  clock();  
  13.     for(int i=0; i < TEST_SIZE; ++i)  
  14.     {  
  15.         char tmp[1];  
  16.         tmp[0] = char(i);  
  17.         of.write(tmp,1);  
  18.     }  
  19.     end = clock();  
  20.     of.close();  
  21.     cout<<"C++ style: "<<end - start <<" ms"<<endl;  
  22.     //c style writing file  
  23.     FILE* fp = fopen(c_write_file, "w");  
  24.     start =  clock();  
  25.     for(int i=0; i < TEST_SIZE; ++i)  
  26.     {  
  27.         char tmp[1];  
  28.         tmp[0] = char(i);  
  29.         fwrite( tmp, 1, 1, fp);  
  30.     }  
  31.     end = clock();  
  32.     fclose(fp);  
  33.     cout<<"C style: "<<end - start <<" ms"<<endl;  
  34.     cin.get();  
  35. }  
 

 

实验结果:

 

图4

图5

图6

 

 

对比图4 和 图1、 图5 和 图2、图6 和 图3, 可以看到  << 运算符没有 ofstream.write(), 快, 但两者还是没有 fwrite() 快

 

结论: 效率   fwrite() >  ofstream.operator<<() > ofstream.write() 

 

 

 

 

3. 下面做读文件的比较:

 

程序设计思路: 用两种方法去读一个近100M的文本,记录时间。

 

实验代码:

 

  1. void test_read()  
  2. {     
  3.     const char* read_file = "H://read4.txt";  
  4.     const int BUF_SIZE = 1024 ;  
  5.     char buf[BUF_SIZE];  
  6.     //c++ style writing file  
  7.     ifstream ifs(read_file,ios::binary);  
  8.     assert(ifs);  
  9.     time_t start, end;  
  10.     start =  clock();  
  11.     while(!ifs.eof())  
  12.     {  
  13.       ifs.read(buf,BUF_SIZE);  
  14.     }  
  15.     end = clock();  
  16.     ifs.close();  
  17.     cout<<"C++ style: "<<end - start <<" ms"<<endl;  
  18.     //c style writing file  
  19.     FILE* fp = fopen(read_file, "rb");  
  20.     start =  clock();  
  21.     int len = 0;  
  22.     do  
  23.     {  
  24.         len = fread(buf,1,BUF_SIZE,fp);  
  25.         //cout<<len<<endl;  
  26.     }while(len != 0);  
  27.     end = clock();  
  28.     fclose(fp);  
  29.     cout<<"C style: "<<end - start <<" ms"<<endl;  
  30.     cin.get();  
  31. }  
 

 

 

实验结果:

图7

 

结论: 读取一个 100M 的文件, fread() 的效率 是 ifstream.read()的将近十倍! (此结论惊人!)

 

 

 

查看评论
2楼 Azrael_Shiki 2011-07-12 13:29发表 [回复]
你的结论的确惊人。
看看我用你的代码在MinGW的g++上的测试结果:
Test text-style writing:
Test size :10000000
C++ style: 718 ms
C style: 1594 ms
Test binary-style writing:
Test size :1000000
C++ style: 63 ms
C style: 156 ms
Test reading:
C++ style: 1047 ms
C style: 609 ms
结果是输出时C++风格比C风格还快,就算是输入C++风格也只花了C风格不到一半的时间。看看你我结果的对比能说明什么(硬件不同所以绝对数值没有可比性,只有同一平台上的对比才有意义)?
只能说明M$VC的C++ I/O是多么的Disabled(翻译成无能还是残疾随你便),奉劝你不要只在M$VC平台上发现了什么就以偏概全地说A比B快云云,就算在M$WIN上,编译器也多的是。多测几个再看看吧,相信你会有新的发现。
1楼 fjnu123012007003 2011-03-10 18:13发表 [回复]
C++的输入输出不要告诉其数据类型,而是采用重载实现的,这个当然比C耗时了。C在读取的时候,都有格式控制符来告诉数据类型的。一般来说,gets比scanf快,scanf比cin快。

 

转载:http://blog.csdn.net/tyt2222008/article/details/6088489

分享到:
评论

相关推荐

    C C++ C++ Builder的各种文件读写操作总结

    在 ANSI C 中,对文件的操作分为两种方式,即流式文件操作和 I/O 文件操作。在流式文件操作中,使用 FILE 结构体来表示文件对象,该结构体包含了文件操作的基本属性。 FILE 结构体的定义如下: typedef struct { ...

    C/C++文件的读写

    C语言的文件操作主要包括打开文件(`fopen()`)、关闭文件(`fclose()`)、读取文件(`fread()`、`fgets()`等)和写入文件(`fwrite()`、`fprintf()`、`fputc()`等)。例如,`fopen()`函数接受文件路径和操作模式...

    C、C++文件的读写操作总结

    在C和C++编程中,文件的读写操作是至关重要的技能,特别是...开发者可以根据项目需求选择合适的方法进行文件读写,确保数据的安全性和效率。在实际编程中,务必注意文件的正确关闭和错误处理,避免数据丢失和资源浪费。

    c语言文件读写操作代码avaWeb-mas开发笔记

    文件流是C语言处理文件的一种抽象方式,通过标准库函数`fopen()`、`fread()`、`fwrite()`、`fscanf()`、`fprintf()`、`fclose()`等进行操作。在C语言中,文件被看作是字节序列,可以按顺序读取或写入。 1. 文件打开...

    c语言文件读写操作代码.zip

    C语言是一种基础且强大的编程语言,它提供了丰富的文件操作功能,包括读取和写入文件。在C语言中,文件操作是通过标准库中的`&lt;stdio.h&gt;`或`&lt;fstream&gt;`(C++中)头文件实现的。在这个“C语言文件读写操作代码”的...

    C&C++文件读写操作总结

    本篇文章将总结C和C++中的文件读写操作,包括基础的C语言文件操作、C++的文件流操作、WINAPI API调用以及BCB库(Borland C++ Builder)提供的文件操作方法,最后还会提及特殊文件的操作。 首先,基于C的文件操作...

    文件读写类

    1. **文件打开与关闭**:提供方法来打开和关闭文件,可能包括错误检查,确保文件正确关闭。 2. **读写模式**:支持读取、写入和追加等多种模式,允许用户选择合适的操作。 3. **数据读写**:提供读取和写入数据的...

    C/C++读写文件操作

    在C/C++编程中,文件操作是至关重要的一个部分,它允许程序员与外部存储设备进行交互,例如磁盘上的文件。本教程将深入探讨如何在C/C++中进行文件的读写操作,以及如何实现完整的程序示例。 一、文件流的概念 在C++...

    CSDN上C/C++文件操作集锦

    在IT领域,文件操作是编程中的基础且至关重要的部分,特别是在C和C++这两种语言中。CSDN上的"C/C++文件操作集锦"提供了一份综合性的资源,包含三份高质量的学习材料:《C++文件操作.pdf》、《C文件操作函数.docx》和...

    文件读写in C++

    本文将深入探讨如何使用C++的标准库`&lt;fstream&gt;`来进行文件的读取和写入操作,同时也将涉及FILE*类型的文件操作,这是C语言遗留下来的接口,但同样可以在C++中使用。 ### 1. `fstream`库的使用 `&lt;fstream&gt;`库提供了...

    C++文件读写+二进制读写+STL文件函数+创建文件+读指针+写指针+读写指针+可应用于系统中底层的文件创建+计算机专业领域

    `fstream`库(包含在`&lt;fstream&gt;`头文件中)提供了一种面向对象的方式来处理文件,如`ifstream`(输入文件流)和`ofstream`(输出文件流)。这些类提供了如`open()`, `close()`, `read()`, `write()`等成员函数,使得...

    c语言大作业图书管理系统(文件读写)

    C语言是一种中级程序设计语言,因其简洁、高效和通用性而广泛应用于系统编程、嵌入式开发等领域。在图书管理系统中,主要涉及以下C语言知识点: 1. **变量与数据类型**:C语言提供了多种数据类型,如整型(int)、...

    C语言文件操作思维导图及实例代码

    1. **文件流与文件指针**:在C语言中,文件被看作是一系列字节的序列,通过文件流(fstream)进行读写。文件操作通常涉及一个名为`FILE`的结构体,它代表了一个打开的文件。我们通过文件指针(file pointer)来操作...

    VC读写操作文件.zip

    在实际的项目中,`FILE.CPP`和`FILE.H`可能会包含使用上述文件操作方法的实现,比如`CFile`类的使用,以及可能的`OpenFileDialog`和`SaveFileDialog`来交互式的读写文件。`fileDlg.cpp`和`fileDlg.h`则可能是自定义...

    vc++用cstdio读写文件例题

    对于二进制文件的读写,`fwrite`和`fread`是常用的选择。这两个函数允许你按字节块读写数据,包括结构体和其他非基本类型的数据。例如,如果你有一个名为`Person`的结构体,你可以这样操作: ```cpp struct Person ...

    文件读写操作总结(自己找的有用的)

    - `fread()`和`fwrite()`:读写指定数量的数据。 - `tmpfile()`:创建临时文件流。 - `tmpnam()`:生成唯一的临时文件名。 在C++中,文件操作通常通过`fstream`库进行,这提供了`ifstream`(输入流)、`ofstream`...

    C++Builder C/C++ 文件读写操作总结.doc

    在C++Builder中,对C和C++语言进行文件读写操作是一个常见的任务。本篇文章将对C++Builder中涉及的文件操作进行总结,包括基于C的文件操作、基于C++的文件操作、基于WinAPI的文件操作、基于BCB库的文件操作以及特殊...

    文件的读写

    9. **文件指针**:虽然`fstream`类提供了简洁的接口,但也可以使用C风格的文件指针`fopen()`、`fclose()`、`fread()`和`fwrite()`等函数进行文件操作。 10. **文件定位**:使用`seekg()`和`seekp()`函数可以移动...

Global site tag (gtag.js) - Google Analytics