高效地读取&解析文件(fread)

本文展示了如何使用fread高效地读取和解析文件,特别是资源列表。作者分享了一段源码,该源码受到Lua单词分割解析模块的启发,但通过0x00字符作为字符串分隔符,而不是像Lua那样使用缓冲区。虽然这种方法不完全安全,但可以提供读取文件的思路。同时,文章比较了不同平台下,读取一千万个随机数所用的时间。
摘要由CSDN通过智能技术生成

自己写的一个读取资源列表的源码,思想来自lua的单词分割解析模块,但是没有像lua一样通过buf来储存每个WORD,采用0x00字符串结束符来分割各个WORD,有点类似投机取巧的感觉,不是绝对安全的方法,所以并不推荐这样写,只是希望能汲取里面解析文件的思路,^_^

/*****************************   
*        ResManager.h        *   
*****************************/
#pragma once
  
struct img_member
{
    wchar_t *name;
    wchar_t *path;
    bool mask;
};
  
struct aimg_member
{
    wchar_t *name;
    wchar_t *path;
    int hnum;
    int vnum;
};
  
struct music_member
{
    char *name;
    char *path;
};
  
class ResManagerClass
{
public:
    std::list<img_member*> imglist;
    std::list<aimg_member*> aimglist;
    std::list<music_member*> musiclist;
  
    bool LoadResArray(const char *resfile);
  
private:
    FILE *f;
  
    char *buf;
    unsigned long filelen;
};
  
extern ResManagerClass ResManager;                                                                                                         
                                                                                                  
                                                  
/*****************************   
*       ResManager.cpp       *   
*****************************/
#include "StdAfx.h"
#include "resmanager.h"
using namespace std;
  
//每种格式的个数
#define MEMBER_NUM_IMG 3
#define MEMBER_NUM_AIMG 4
#define MEMBER_NUM_MUSIC 2
enum ResStyle {img,aimg,music,none};
  
ResManagerClass ResManager;
  
  
bool ResManagerClass::LoadResArray(const char *resfile)
{
    if(fopen_s(&f,resfile,"rb"))
        return false;
  
    fseek(f,0,2); filelen = ftell(f); fseek(f,0,0);
    buf = new char[filelen];
    fread(buf,filelen,1,f);
  
    //初始化各种mark
    bool in_note = false, in_string = false;
    int string_strat_pos = -1, mn_img = 0, mn_aimg = 0, mn_music = 0;
    char *string = 0;
    ResStyle style_entry = none;
    char *imgmember_str[MEMBER_NUM_IMG], *aimgmember_str[MEMBER_NUM_AIMG], *musicmember_str[MEMBER_NUM_MUSIC];
  
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值