みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

オンメモリファイルもどき

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

オンメモリファイルもどき

投稿記事 by みけCAT » 14年前

ファイルのように動作するが、データはメモリ上にあるというものを作ってみました。
データはメモリ上にあるので高速にアクセスできます。(できるはずです)
今のところfgetcとfputcしかできませんが、とりあえず組み込もうと思ったソフトにはこれで十分です。
nisefile.h

CODE:

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); 
};
nisefile.cpp

CODE:

#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;
}
サンプルプログラム(main.c)

CODE:

#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;
}

コメントはまだありません。