| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1141 人关注过本帖
标题:看到百度百科这么一句话,顿时没有任何语言了。
只看楼主 加入收藏
天使梦魔
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
结帖率:83.33%
收藏
 问题点数:0 回复次数:6 
看到百度百科这么一句话,顿时没有任何语言了。
来自: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;
}


结果:
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 百度百科 字符串 write 
2015-01-24 19:15
天使梦魔
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
收藏
得分:0 
再来一张1.67G文件的对比:
图片附件: 游客没有浏览图片的权限,请 登录注册
2015-01-24 19:47
stop1204
Rank: 9Rank: 9Rank: 9
来 自:福建省
等 级:贵宾
威 望:22
帖 子:295
专家分:1151
注 册:2013-9-8
收藏
得分:0 
回复 2楼 天使梦魔
那应该是以前的电脑运算慢才能体现的吧.现在电脑速度快了 差距就小了

hl928452957@gmail点com

2015-01-25 07:39
天使梦魔
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
收藏
得分:0 
换成p3的U,也差不多是这样。
fstream调用fopen,对它进行了封包,用调试模式跟踪就可以看到
而fopen调用底层系统I/O开关,fopen也并不是最原始的驱动
假如按黄金比例调整读取值,无论文件大小两者相差不会超过10秒
fstream只是做了一个向上的安全转换,自动回收资源和提供智能管理(尽管封包也限制了某些行为)
但被黑成慢了256倍是什么概念?
就是说FILE*读一个文件只要1秒!!!
而fstream读同样文件要256秒!!!

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

就是说FILE*读一个文件只要1小时!!!
而fstream读同样文件要256小时!!!
2015-01-25 12:13
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
收藏
得分:0 
不应噶吧

我不是砖家,要努力成为砖家。
2015-01-25 15:42
ITCD
Rank: 2
等 级:论坛游民
威 望:2
帖 子:16
专家分:18
注 册:2012-11-26
收藏
得分:0 
楼主威武!
2015-01-25 17:05
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
关键是看在低层的IO上封装了多少层

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2015-01-29 10:35
快速回复:看到百度百科这么一句话,顿时没有任何语言了。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028326 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved