注册 登录
编程论坛 C++教室

看到百度百科这么一句话,顿时没有任何语言了。

天使梦魔 发布于 2015-01-24 19:15, 1152 次点击
来自:http://baike.baidu.com/view/32758.htm
C++中的FILE

需要加入stdio来使用FILE。

格式:FILE *name = fopen(filename,type);

filename是文件名

type是指示文件读取方式的字符串:

"r" = read "w" = write "rw" = read&write

定义*name后,便可以使用fprintf(*FILE,string,var1,var2,..)来快速读入读出文件了。

利用FILE* 和fprintf的文件I/O速度是使用fstream文件流的256倍


于是自己弄了一下,就是不知道这个256倍是怎么得出来的:
程序代码:
#include <iostream>
#include <fstream>
#include <windows.h>
#include <stdio.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int sum;
    char file[1024];
    ifstream in;
    in.open("1.exe",ios::binary);
    in.seekg(0,ios::end);
    sum=in.tellg();
    char* file1=new char[sum];
    cout<<"文件大小:"<<sum<<"字节"<<endl;
//------------------一次读入1024字符------------------
    in.seekg(0,ios::beg);
    DWORD start_time1=GetTickCount();//计时开始
    for(unsigned int i=0;i<sum/1024;i++)
    {
        in.read(file,1024);
        for(int s=0;s<1024;s++)file1[i*1024+s]=file[s];
    }
    if(sum%1024)
    {
        in.read(file,1024);
        for(int s=0;s<sum%1024;s++)file1[sum-1024+s]=file[s];
    }
    DWORD end_time1=GetTickCount();//计时结束
    cout<<"C++文件流每次读1024字符失去毫秒:"<<(end_time1-start_time1)<<"ms!"<<endl;
//------------------一个一个的读------------------
    in.seekg(0,ios::beg);
    DWORD start_time2=GetTickCount();//计时开始
    for(unsigned int i=0;i<sum;i++)
    {
        in.get(file1[i]);
    }
    DWORD end_time2=GetTickCount();//计时结束
    cout<<"C++文件流每次读1个字符失去毫秒:"<<(end_time2-start_time2)<<"ms!"<<endl;

//------------------fopen读------------------
    FILE* f=fopen("1.exe","rb+");
    DWORD start_time3=GetTickCount();//计时开始
    for(unsigned int i=0;i<sum/1024;i++)
    {
        fread(&file,sizeof(char),1024,f);
        for(int s=0;s<1024;s++)file1[i*1024+s]=file[s];
    }
    if(sum%1024)
    {
        fread(&file,sizeof(char),1024,f);
        for(int s=0;s<sum%1024;s++)file1[sum-1024+s]=file[s];
    }
    DWORD end_time3=GetTickCount();//计时结束
    cout<<"C文件流每次读入1024个字符失去毫秒:"<<(end_time3-start_time3)<<"ms!"<<endl;


    delete []file1;
    in.close();
    fclose(f);
    cin.get();
    return 0;
}


结果:
只有本站会员才能查看附件,请 登录
6 回复
#2
天使梦魔2015-01-24 19:47
再来一张1.67G文件的对比:
只有本站会员才能查看附件,请 登录
#3
stop12042015-01-25 07:39
回复 2楼 天使梦魔
那应该是以前的电脑运算慢才能体现的吧.现在电脑速度快了 差距就小了
#4
天使梦魔2015-01-25 12:13
换成p3的U,也差不多是这样。
fstream调用fopen,对它进行了封包,用调试模式跟踪就可以看到
而fopen调用底层系统I/O开关,fopen也并不是最原始的驱动
假如按黄金比例调整读取值,无论文件大小两者相差不会超过10秒
fstream只是做了一个向上的安全转换,自动回收资源和提供智能管理(尽管封包也限制了某些行为)
但被黑成慢了256倍是什么概念?
就是说FILE*读一个文件只要1秒!!!
而fstream读同样文件要256秒!!!

就是说FILE*读一个文件只要1分钟!!!
而fstream读同样文件要256分钟!!!

就是说FILE*读一个文件只要1小时!!!
而fstream读同样文件要256小时!!!
#5
砖家的谎言2015-01-25 15:42
不应噶吧
#6
ITCD2015-01-25 17:05
楼主威武!
#7
waterstar2015-01-29 10:35
关键是看在低层的IO上封装了多少层
1