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

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

 

我的机器是Windows XP, Visual Studio 2008

 

1. 测试写文件速度

 

 

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

 

 

实验代码:

 

[cpp]  view plain  copy
  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); 后结果:

 

 

实验代码:

 

[cpp]  view plain  copy
  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的文本,记录时间。

 

实验代码:

[cpp]  view plain  copy
  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,<a href="http://lib.csdn.net/base/ios" class='replace_word' title="iOS知识库" target='_blank' style='color:#df3434; font-weight:bold;'>iOS</a>::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()的将近十倍! (此结论惊人!)

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++文件读写fstream结构体是C++中用于文件读写的一种标准库。它提供了一种简单的方式来读写文件,包括文本文件和二进制文件。具体来说,fstream结构体提供了三种不同的文件操作方式:读取(input)、写入(output)和读写(input/output)。你可以使用它来打开一个文件、读取文件内容、写入数据到文件或者在文件中进行读写操作。 下面是一个简单的例子来说明如何使用fstream结构体来读写文件: ``` #include <iostream> #include <fstream> using namespace std; int main() { // 创建一个fstream对象并打开文件 fstream file("example.txt", ios::in | ios::out | ios::trunc); // 写入数据到文件 file << "Hello, World!" << endl; // 从文件中读取数据 string line; getline(file, line); cout << line << endl; // 关闭文件 file.close(); return 0; } ``` 在上面的代码中,我们首先创建了一个fstream对象,并通过构造函数打开了名为example.txt的文件。在这个例子中,我们使用了三个不同的文件操作方式:ios::in(输入)、ios::out(输出)和ios::trunc(截断)。这意味着我们可以从文件中读取数据,也可以向文件中写入数据,并且每次打开文件时都会清空文件内容。 接下来,我们将“Hello, World!”写入到文件中。然后,我们使用getline()函数从文件中读取一行数据,并将其存储到字符串变量line中。最后,我们将line输出到控制台。 最后,我们调用close()函数关闭文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值