bfile
bfilew
の2種類があり、bfilewの方は書き込みしかできませんが、若干高速で、若干メモリを節約できます。
以下使用例です。
► スポイラーを表示
#include "bfile.h"
void main(){
size_t num;
string s;
bfile f("test.dat"); //インスタンス化
f >> num >> s; //読み込み
f > num >> s > addsize(c, 9*sizeof(char) );
c[9]=0;
!bfile("test.dat") > 演算子よりもaddsizeの方が先に翻訳されてしまうからです。
[code] size_t num;
char c[100];
bfile("test.dat") >> num >> addsizeref(c, (long &)num);
落ちている場合はtrue そうでなければfalseが返されます。
wfell()・・・書き込み用としてファイルが開けたか
rfell()・・・読み込み用としてファイルが開けたか
fell()・・・書き込み用、読み込み用の両方が落ちている場合のみtrue
※bfilewの場合はfell()のみで、書き込み用が落ちていればtrueを返します
以上です。シーク機能は今のところつける予定はありません。
以下ソースです。
► スポイラーを表示
#include
#include
#include
#include
using namespace std;
struct addsize{
void * myadd;
long mysize;
string * stradd;
bool addmode;
addsize(){}
void strinit(string & input, long size){
stradd = &input;
addmode = true;
mysize = size;
}
addsize(string &input, long size){ strinit(input, size); }
addsize(string &input){ strinit(input, -1); }
template
void init(X & address, long size){
addmode = false;
myadd = address;
mysize = size;
}
template
addsize(X & address, long size){ init(address, size); }
template
addsize(X & address){ init(address, -1); }
};
struct addsizeref :public addsize{
addsizeref(string &input, long & size){ strinit(input, size); }
template
addsizeref(X & address, long & size){ init(address, size); }
};
struct cls{};
class bfilew{
bool crePerm;
protected:
bool wstate;
ofstream ofs;
string fName;
public:
bfilew(){}
bool init(const string &fileName, bool createPermission = true){
wstate = true;
if(!createPermission && GetFileAttributes(fileName.c_str() )!=-1) wstate = false;
if(!wstate) return false;
fName = fileName;
crePerm = createPermission;
ofs.open(fileName.c_str(), ios::binary|ios::app);
if(!ofs){ wstate=false; return false; }
return true;
}
bfilew(const string &fileName, bool createPermission = true){ init(fileName, createPermission); }
bool fell(){ return !wstate; }
bfilew & clear(){
if(!wstate) return *this;
ofs.close();
ofs.open(fName.c_str(), ios::binary);
return *this;
}
bfilew & operator! (){
clear();
return *this;
}
bfilew & operatorsubstr(0, output.mysize).c_str();
else ofs.write( (const char *)output.myadd, output.mysize);
return *this;
}
template
bfilew & operator content;
int contPoint;
size_t unsint;
bool rstate;
public:
bfile(){}
bool init2(const string &fileName, bool createPermission = true){
rstate = true;
if(!createPermission && GetFileAttributes(fileName.c_str() )!=-1) return rstate = false;
contPoint = 0;
unsint = 0;
ifstream ifs(fileName.c_str(), ios::binary);
int contNum = 0;
while(!ifs.eof() ){
content.resize(contNum+1);
ifs.read( (char*)&(content[contNum]), sizeof(char) );
contNum++;
}
rstate = init(fileName, createPermission);
return rstate;
}
bfile(const string &fileName, bool createPermission = true){ init2(fileName, createPermission); }
bool fell(){
if(wstate || rstate) return false;
return true;
}
bool wfell(){ return !wstate; }
bool rfell(){ return !rstate; }
template
bfile & read (X &input){
if(!rstate) return *this;
memcpy(&input, &content[0]+contPoint, sizeof(input) );
contPoint += sizeof(input);
return *this;
}
bfile & operator>> (addsize &input){
if(!rstate) return *this;
if(input.addmode){
char c;
size_t num = input.mysize;
if(input.mysize==-1) num = unsint;
*(input.stradd) = "";
for(size_t i=0;i> (string & input){
*this >> addsize(input, (long &)unsint);
return *this;
}
template
bfile & operator>> (X &input){
read(input);
if(sizeof(unsint) >= sizeof(input) ){
unsint = 0;
memcpy(&unsint, &input, sizeof(input) );
}
return *this;
}
};