トップページ > 過去ログ > 記事閲覧
fstreamでDXアーカイブにアクセスをしたい
名前:AzC 日時: 2010/06/20 08:55

題名の通りの質問なのですが、やはり無理でしょうか・・・。 というのも、スクリプト(.txt)ファイルを読み込んで動作させるゲームエンジンモドキを作ったのですが、 よく考えたらDXアーカイブへのアクセスはDXライブラリ内のFileRead_〜等の関数越しでしか出来ないことに気づき質問した次第です。 C++のfstream系の操作をC言語風のファイルポインタでの操作に書き換えるのが非常に手間な上に、 一応書き換えてみたのですが上手く動かず・・・。 DXアーカイブ内へアクセスするような隠し関数とか無いでしょうか・・・。

Page: 1 |

Re: fstreamでDXアーカイブにアクセスをしたい ( No.1 )
名前:いっち 日時:2010/06/20 14:40

> DXアーカイブ内へアクセスするような隠し関数とか無いでしょうか・・・。 どの様な機能を必要とされているのか、いまいち理解しかねるのですが、 DXアーカイブの読み出しは FileRead_系で行うしか無いと思います。 > C++のfstream系の操作をC言語風のファイルポインタでの操作に書き換えるのが非常に手間な上に、 > 一応書き換えてみたのですが上手く動かず・・・。 どういった部分でうまくいかないのでしょうか? strstreamやstringstreamを代用することで解決しないでしょうか?
Re: fstreamでDXアーカイブにアクセスをしたい ( No.2 )
名前:らり 日時:2010/06/20 17:25

即席で、それほど動作確認をできていませんが・・・ 以下のような、FileRead_系関数をラッピングしたstreamクラスでは問題は解決しないでしょうか? idxfstreamがifstreamのように使える(はず)です。 ifstreamと異なる点は、seekg時のポインタ初期位置の指定に、FileRead_seekと同じDXライブラリで定義された引数を利用する点ぐらいのはずです。 class dxfstreambuf:public std::streambuf{ protected: int FileHandle; public: dxfstreambuf(char* FilePath){ FileHandle=FileRead_open(FilePath); } ~dxfstreambuf(){FileRead_close(FileHandle);} protected: int xsgetn(char* c_p,std::streamsize size){ return FileRead_read(c_p,size,FileHandle); } int uflow(){return FileRead_getc(FileHandle);} int pbackfail(int nCh){ FileRead_seek(FileHandle,-1,SEEK_CUR); return 0; } int underflow(){ int ans=uflow(); FileRead_seek(FileHandle,-1,SEEK_CUR); return ans; } public: bool eof(){return FileRead_eof(FileHandle)!=0;} int tellg(){return FileRead_tell(FileHandle);} void seekg(int n){seekg(n,SEEK_SET);} void seekg(int n,int origin){FileRead_seek(FileHandle,n,origin);} }; class idxfstream:public std::istream{ private: dxfstreambuf* streambuf; std::_Uninitialized uninit; public: idxfstream():std::istream(uninit){streambuf=0;} idxfstream(char* FilePath):std::istream(uninit){ streambuf=0; open(FilePath); } ~idxfstream(){close();} void open(char* FilePath){ close(); streambuf= new dxfstreambuf(FilePath); std::istream::init(streambuf); } void close(){ if(streambuf==0)return; delete streambuf; streambuf=0; } bool eof(){return streambuf->eof();} bool is_open(){return streambuf!=0;} pos_type tellg(){return streambuf->tellg();} void seekg(pos_type n){return streambuf->seekg(n);} void seekg(off_type n,int rel){return streambuf->seekg(n,rel);} };
Re: fstreamでDXアーカイブにアクセスをしたい ( No.3 )
名前:AzC(解決) 日時:2010/06/21 08:51

>いっち さん 1バイト文字と2バイト文字の区別/シーク付近が・・・。 >らり さん うおおおおお……素晴らしいです。そのまま置き換えて動きました! コード読んで勉強させていただきます! ありがとうございました!

Page: 1 |