データはメモリ上にあるので高速にアクセスできます。(できるはずです)
今のところfgetcとfputcしかできませんが、とりあえず組み込もうと思ったソフトにはこれで十分です。
nisefile.h
struct nfdata {
nfdata* prev;
unsigned char* data;
nfdata* next;
};
class NiseFile {
private:
nfdata* first;
nfdata* current;
unsigned int buffersize;
unsigned long long filesize;
unsigned long long ptr;
public:
//定数
//static const int SEEK_SET=0;
//static const int SEEK_CUR=1;
//static const int SEEK_END=2;
//コンストラクタ
NiseFile();
NiseFile(unsigned int _buffersize);
//デストラクタ
~NiseFile();
//データ操作用関数
int nffopen(const char* mode);
int nffgetc();
//int nffgets(char* out,int size);
int nffputc(int c);
//int nffputs(const char* in);
//int nffread(void* ptr,int size,int kazu);
//int nffwrite(void* ptr,int size,int kazu);
//int nfftell();
//int nffseek(long long offset,int mode);
//int nffeof();
//データのセーブとロード
int load(const char* filename,bool binary=false);
int save(const char* filename,bool binary=false);
};
#include
#include "nisefile.h"
NiseFile::NiseFile() {
NiseFile(10240);
}
NiseFile::NiseFile(unsigned int _buffersize) {
buffersize=_buffersize;
filesize=0;
ptr=0;
first=current=new nfdata();
first->prev=NULL;
first->data=new unsigned char[buffersize];
first->next=NULL;
}
NiseFile::~NiseFile() {
nfdata* now;
nfdata* tugi;
now=first;
while(now!=NULL) {
tugi=now->next;
delete now->data;
delete now;
now=tugi;
}
}
int NiseFile::nffopen(const char* mode) {
if(mode[0]=='r') {
current=first;
ptr=0;
} else if(mode[0]=='w') {
//デストラクタのコピー
nfdata* now;
nfdata* tugi;
now=first;
while(now!=NULL) {
tugi=now->next;
delete now->data;
delete now;
now=tugi;
}
//コンストラクタのコピー
filesize=0;
ptr=0;
first=current=new nfdata();
first->prev=NULL;
first->data=new unsigned char[buffersize];
first->next=NULL;
//} else if(mode[0]=='a') {
// ptr=filesize;
} else return 0;
return 1;
}
int NiseFile::nffgetc() {
int result;
if(ptr>=filesize)return -1;
result=current->data[ptr%buffersize];
ptr++;
if(ptr%buffersize==0) {
if(current->next==NULL) {
current->next=new nfdata();
current->next->prev=current;
current->next->next=NULL;
current->next->data=new unsigned char[buffersize];
}
current=current->next;
}
return result;
}
int NiseFile::nffputc(int c) {
current->data[ptr%buffersize]=c;
if(ptr>=filesize)filesize=ptr+1;
ptr++;
if(ptr%buffersize==0) {
if(current->next==NULL) {
current->next=new nfdata();
current->next->prev=current;
current->next->next=NULL;
current->next->data=new unsigned char[buffersize];
}
current=current->next;
}
return c;
}
int NiseFile::load(const char* filename,bool binary) {
FILE* in;
unsigned int size;
in=fopen(filename,binary?"rb":"r");
if(in==NULL)return -1;
//デストラクタのコピー
nfdata* now;
nfdata* tugi;
now=first;
while(now!=NULL) {
tugi=now->next;
delete now->data;
delete now;
now=tugi;
}
//コンストラクタのコピー
filesize=0;
ptr=0;
first=current=new nfdata();
first->prev=NULL;
first->data=new unsigned char[buffersize];
first->next=NULL;
while(size=fread(current->data,sizeof(unsigned char),buffersize,in)) {
filesize+=size;
if(size==buffersize) {
current->next=new nfdata();
current->next->prev=current;
current->next->next=NULL;
current->next->data=new unsigned char[buffersize];
current=current->next;
}
}
current=first;
fclose(in);
return filesize;
}
int NiseFile::save(const char* filename,bool binary) {
FILE* out;
nfdata* now;
unsigned long long wrotesize;
out=fopen(filename,binary?"wb":"w");
if(out==NULL)return -1;
now=first;
for(wrotesize=0;wrotesizedata,sizeof(unsigned char),
filesize-wrotesizenext;
}
fclose(out);
return (int)wrotesize;
}
#include
#include "nisefile.h"
int main(int argc, char *argv[]) {
NiseFile* nf=new NiseFile(5);
NiseFile* io=new NiseFile(100);
char str[]="Hello,World!";
char str2[]="I like cats very much!";
int i;
nf->nffopen("w");
for(i=0;str[i]!=0;i++)nf->nffputc(str[i]);
nf->nffopen("r");
while((i=nf->nffgetc())!=-1)putchar(i);
puts("");
io->nffopen("w");
for(i=0;str2[i]!=0;i++)io->nffputc(str2[i]);
io->save("test.txt");
io->nffopen("w");
for(i=0;str[i]!=0;i++)io->nffputc(str[i]);
io->load("test.txt");
io->nffopen("r");
while((i=io->nffgetc())!=-1)putchar(i);
puts("");
delete nf;
delete io;
return 0;
}