- 浏览: 3449644 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
sonichy:
Qt5改动很多,要改改了。
基于QItemDelegate的例子1 SpinBoxDelegate -
我的主页6:
楼主,2.2子查询的分页方式:SELECT * FROM ar ...
Mysql 分页语句Limit用法 -
liguoqi:
非常感谢楼主的用心指导,工具以及图片例子都提供了 赞!
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
问下这个图片怎么解压损坏呀
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载 -
liguoqi:
楼主讲解的非常详细,还附带工具和图片例子,非常感谢
两款免费DCIOM 图像浏览软件介绍和DICOM图像例子供下载
我觉得作者写的挺好,评论也写的很对。
目前我的项目就是在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
- void test_write()
- {
- const int TEST_SIZE = 10000000 ;
- const char* c_plus_write_file = "H://c_plus_write_file.txt";
- const char* c_write_file = "H://c_write_file.txt";
- cout<<"Test size :" << TEST_SIZE <<endl;
- //c++ style writing file
- ofstream of(c_plus_write_file);
- assert(of);
- time_t start, end;
- start = clock();
- for(int i=0; i < TEST_SIZE; ++i)
- {
- char tmp[1];
- tmp[0] = char(i);
- of << tmp[0];
- }
- end = clock();
- of.close();
- cout<<"C++ style: "<<end - start <<" ms"<<endl;
- //c style writing file
- FILE* fp = fopen(c_write_file, "w");
- start = clock();
- for(int i=0; i < TEST_SIZE; ++i)
- {
- char tmp[1];
- tmp[0] = char(i);
- fwrite( tmp, 1, 1, fp);
- }
- end = clock();
- fclose(fp);
- cout<<"C style: "<<end - start <<" ms"<<endl;
- cin.get();
- }
实验结果:
图1
图2
图3
**从图1、2、3,可以看出, ofstream 的 << 运算符 所耗时 是fwrite()的近三倍
把of<<的代码改成了: of.write(tmp,1); 后结果:
实验代码:
- void test_write()
- {
- const int TEST_SIZE = 1000000 ;
- const char* c_plus_write_file = "H://c_plus_write_file.txt";
- const char* c_write_file = "H://c_write_file.txt";
- cout<<"Test size :" << TEST_SIZE <<endl;
- //c++ style writing file
- ofstream of(c_plus_write_file);
- assert(of);
- time_t start, end;
- start = clock();
- for(int i=0; i < TEST_SIZE; ++i)
- {
- char tmp[1];
- tmp[0] = char(i);
- of.write(tmp,1);
- }
- end = clock();
- of.close();
- cout<<"C++ style: "<<end - start <<" ms"<<endl;
- //c style writing file
- FILE* fp = fopen(c_write_file, "w");
- start = clock();
- for(int i=0; i < TEST_SIZE; ++i)
- {
- char tmp[1];
- tmp[0] = char(i);
- fwrite( tmp, 1, 1, fp);
- }
- end = clock();
- fclose(fp);
- cout<<"C style: "<<end - start <<" ms"<<endl;
- cin.get();
- }
实验结果:
图4
图5
图6
对比图4 和 图1、 图5 和 图2、图6 和 图3, 可以看到 << 运算符没有 ofstream.write(), 快, 但两者还是没有 fwrite() 快
结论: 效率 fwrite() > ofstream.operator<<() > ofstream.write()
3. 下面做读文件的比较:
程序设计思路: 用两种方法去读一个近100M的文本,记录时间。
实验代码:
- void test_read()
- {
- const char* read_file = "H://read4.txt";
- const int BUF_SIZE = 1024 ;
- char buf[BUF_SIZE];
- //c++ style writing file
- ifstream ifs(read_file,ios::binary);
- assert(ifs);
- time_t start, end;
- start = clock();
- while(!ifs.eof())
- {
- ifs.read(buf,BUF_SIZE);
- }
- end = clock();
- ifs.close();
- cout<<"C++ style: "<<end - start <<" ms"<<endl;
- //c style writing file
- FILE* fp = fopen(read_file, "rb");
- start = clock();
- int len = 0;
- do
- {
- len = fread(buf,1,BUF_SIZE,fp);
- //cout<<len<<endl;
- }while(len != 0);
- end = clock();
- fclose(fp);
- cout<<"C style: "<<end - start <<" ms"<<endl;
- cin.get();
- }
实验结果:
图7
结论: 读取一个 100M 的文件, fread() 的效率 是 ifstream.read()的将近十倍! (此结论惊人!)
看看我用你的代码在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上,编译器也多的是。多测几个再看看吧,相信你会有新的发现。
转载:http://blog.csdn.net/tyt2222008/article/details/6088489
发表评论
-
C++ 实现把非静态成员函数作为回调函数(非static)
2012-11-16 10:10 14598众所周知,C++的类成员函数不能像普通函数那样用于回调,因 ... -
【转】windows多线程CreateThread与_beginthreadex本质区别
2012-11-15 14:40 13824本文将带领你与多线程作第一次亲密接触,并深入分析Crea ... -
windows下C语言多线程编程
2012-11-15 14:37 10030_beginThreadex创建多线程解读 一、需 ... -
ostringstream 的清空数据方法
2012-09-27 15:28 19402关于C++中 <sstream>中ostrings ... -
输入参数和输出参数
2012-09-26 10:43 36701. 输入参数,是函数的调用者,传递给函数的实现者,对函 ... -
ofstream、ifstream、fstream
2012-09-23 19:23 2924学习一下C++的文件流: ofstream是从内 ... -
将ostream 对象转换成字符串流输出
2012-09-22 10:47 8604将ostream 对象转换成字符串流输出 因为项目中需 ... -
sstream和strstream以及fstream
2012-09-22 10:38 4459在C++有两种字符串流,也称为数组I/O流,一种在sstre ... -
字符串流 ostrstream 和 istrstream
2012-09-22 10:28 7931ostrstream类流 /*ostrst ... -
将有格式的int解析成float
2012-09-20 18:10 2313因项目中有一个需求:将采集到所有short int 转换成fl ... -
回调函数测试例子
2012-09-29 14:15 4329回调函数就是一个通过函数指针调用的函数。如果你把函数的指 ... -
fatal error C1083: Cannot open include file: 'iostream.h': No such file or dire
2012-09-20 17:19 6448错误: fatal error C1083: Cannot o ... -
C++中类的声明
2012-08-29 16:28 6947可以声明一个类而不定义它 class Sc ... -
only static const integral data members can be initialized within a class
2012-06-28 11:40 2748翻译一下:只有静态整型常量数据成员能在类中初始化 ... -
C/C++快速写入类结构对象进入文件
2012-06-19 10:38 0void QObject::deleteLater() { ... -
C语言文件操作函数大全
2012-06-18 13:54 2386C语言文件操作函数大 ... -
C++ 动态申请数组
2012-06-09 00:05 6710方法1、C++使用vector方便 ... -
VC++动态链接库(DLL)编程深入浅出(ZZ)
2012-06-08 10:06 24501.概论 先来阐述一下DLL(Dynamic Link ... -
C++中的头文件和源文件
2012-05-09 14:54 6626一、C++编译模式 通常 ... -
C语言下,获取文件信息
2012-05-08 15:07 6695C语言下,如何获取文件的生成时间,日期和文件大小等文件信息。 ...
相关推荐
在 ANSI C 中,对文件的操作分为两种方式,即流式文件操作和 I/O 文件操作。在流式文件操作中,使用 FILE 结构体来表示文件对象,该结构体包含了文件操作的基本属性。 FILE 结构体的定义如下: typedef struct { ...
C语言的文件操作主要包括打开文件(`fopen()`)、关闭文件(`fclose()`)、读取文件(`fread()`、`fgets()`等)和写入文件(`fwrite()`、`fprintf()`、`fputc()`等)。例如,`fopen()`函数接受文件路径和操作模式...
在C和C++编程中,文件的读写操作是至关重要的技能,特别是...开发者可以根据项目需求选择合适的方法进行文件读写,确保数据的安全性和效率。在实际编程中,务必注意文件的正确关闭和错误处理,避免数据丢失和资源浪费。
文件流是C语言处理文件的一种抽象方式,通过标准库函数`fopen()`、`fread()`、`fwrite()`、`fscanf()`、`fprintf()`、`fclose()`等进行操作。在C语言中,文件被看作是字节序列,可以按顺序读取或写入。 1. 文件打开...
C语言是一种基础且强大的编程语言,它提供了丰富的文件操作功能,包括读取和写入文件。在C语言中,文件操作是通过标准库中的`<stdio.h>`或`<fstream>`(C++中)头文件实现的。在这个“C语言文件读写操作代码”的...
本篇文章将总结C和C++中的文件读写操作,包括基础的C语言文件操作、C++的文件流操作、WINAPI API调用以及BCB库(Borland C++ Builder)提供的文件操作方法,最后还会提及特殊文件的操作。 首先,基于C的文件操作...
1. **文件打开与关闭**:提供方法来打开和关闭文件,可能包括错误检查,确保文件正确关闭。 2. **读写模式**:支持读取、写入和追加等多种模式,允许用户选择合适的操作。 3. **数据读写**:提供读取和写入数据的...
在C/C++编程中,文件操作是至关重要的一个部分,它允许程序员与外部存储设备进行交互,例如磁盘上的文件。本教程将深入探讨如何在C/C++中进行文件的读写操作,以及如何实现完整的程序示例。 一、文件流的概念 在C++...
在IT领域,文件操作是编程中的基础且至关重要的部分,特别是在C和C++这两种语言中。CSDN上的"C/C++文件操作集锦"提供了一份综合性的资源,包含三份高质量的学习材料:《C++文件操作.pdf》、《C文件操作函数.docx》和...
本文将深入探讨如何使用C++的标准库`<fstream>`来进行文件的读取和写入操作,同时也将涉及FILE*类型的文件操作,这是C语言遗留下来的接口,但同样可以在C++中使用。 ### 1. `fstream`库的使用 `<fstream>`库提供了...
`fstream`库(包含在`<fstream>`头文件中)提供了一种面向对象的方式来处理文件,如`ifstream`(输入文件流)和`ofstream`(输出文件流)。这些类提供了如`open()`, `close()`, `read()`, `write()`等成员函数,使得...
C语言是一种中级程序设计语言,因其简洁、高效和通用性而广泛应用于系统编程、嵌入式开发等领域。在图书管理系统中,主要涉及以下C语言知识点: 1. **变量与数据类型**:C语言提供了多种数据类型,如整型(int)、...
1. **文件流与文件指针**:在C语言中,文件被看作是一系列字节的序列,通过文件流(fstream)进行读写。文件操作通常涉及一个名为`FILE`的结构体,它代表了一个打开的文件。我们通过文件指针(file pointer)来操作...
在实际的项目中,`FILE.CPP`和`FILE.H`可能会包含使用上述文件操作方法的实现,比如`CFile`类的使用,以及可能的`OpenFileDialog`和`SaveFileDialog`来交互式的读写文件。`fileDlg.cpp`和`fileDlg.h`则可能是自定义...
对于二进制文件的读写,`fwrite`和`fread`是常用的选择。这两个函数允许你按字节块读写数据,包括结构体和其他非基本类型的数据。例如,如果你有一个名为`Person`的结构体,你可以这样操作: ```cpp struct Person ...
- `fread()`和`fwrite()`:读写指定数量的数据。 - `tmpfile()`:创建临时文件流。 - `tmpnam()`:生成唯一的临时文件名。 在C++中,文件操作通常通过`fstream`库进行,这提供了`ifstream`(输入流)、`ofstream`...
在C++Builder中,对C和C++语言进行文件读写操作是一个常见的任务。本篇文章将对C++Builder中涉及的文件操作进行总结,包括基于C的文件操作、基于C++的文件操作、基于WinAPI的文件操作、基于BCB库的文件操作以及特殊...
9. **文件指针**:虽然`fstream`类提供了简洁的接口,但也可以使用C风格的文件指针`fopen()`、`fclose()`、`fread()`和`fwrite()`等函数进行文件操作。 10. **文件定位**:使用`seekg()`和`seekp()`函数可以移动...