Re: iniファイルをDxアーカイブから読み込みたい ( No.1 ) |
- 名前:管理人 日時:2019/10/24 01:31
> Dxファイル内のファイルを一括でメモリ上に読み込んで、それを temp.ini に出力し
> そこから情報を読み込んで最後に temp.ini を削除する方法を考えているのですが、処理速度がおそらく遅く問題があるので
> 実装していただければ嬉しいです
いえ、恐らく余程高速な処理を求められていない限りはその方法で速度に問題は無いと思います
よろしければその方法で処理を実装してみてください m(_ _)m
|
Re: iniファイルをDxアーカイブから読み込みたい ( No.2 ) |
- 名前:にこよう 日時:2019/10/25 15:45
すみません、処理速度が遅くなるのと別に
アーカイブに隠したかったゲーム内のデータが見られてしまう
定期的に参照する場合はtempファイルをしばらく残すことになり、敵などのデータを改変できてしまう
予期しない方法で終了すればtempファイルが残ってしまう
等の問題があり、正直に言えば余りこの方法で実装したくありませんでした
iniファイルの読み込み機能は比較的使えそうだと思うのですが、
実装するのが難しかったり、大変なのでしょうか?
|
Re: iniファイルをDxアーカイブから読み込みたい ( No.3 ) |
- 名前:紺帽子 日時:2019/10/26 02:22
INIファイルはアプリケーション起動の初期設定として使用して
その簡便さからユーザーがある程度自分で編集して使うという認識です。
例えばウィンドウ位置だとかメッセージ速度など。
そのため隠すのではなく実行ファイルと同じ位置に生成して使うので
その場合はWindowsAPIを使用しても問題ないと思います。
INIファイルは厳密にフォーマットが決まっていないので少し面倒ですが
INIファイルをDXアーカイブ内から参照するなら、自分が記述することが前提になるので
自分専用の読み取りプログラムを書けばよいだけだと思います。
(自分用ならINIファイルのセクション部やコメントなどは必要ないでしょう)
もちろん自分で記述するとはいえ、プログラムの入力に対するエラー処理はちゃんと必要です。
それにDXアーカイブ内の敵データなどはほかのフォーマット(例えばCSVなど)のほうが適していそうです。
|
Re: iniファイルをDxアーカイブから読み込みたい ( No.4 ) |
- 名前:にこよう 日時:2019/10/26 14:54
御返信ありがとうございます
確かに本来はおっしゃる通りの使い方をすべきなのだと思います
>INIファイルをDXアーカイブ内から参照するなら、自分が記述することが前提になるので
>自分専用の読み取りプログラムを書けばよいだけだと思います。
>それにDXアーカイブ内の敵データなどはほかのフォーマット(例えばCSVなど)のほうが適していそうです。
実はゲームのマップエディタから出力したデータを保存しており、ゲーム内の様々なオブジェクトを
一つのファイルに保存するため、管理しやすいiniファイルを使用しています
後で自分で書き換えられるようにバイナリにはしたくありませんでした
>自分専用の読み取りプログラムを書けばよいだけだと思います。
プログラムで出力したものを自分で少し書き換える場合は
iniの形式が最適(一番簡単)だと思っています
もし、自分でDxアーカイブ内のデータを読み取る場合は
1番スレッドで記述した方法で妥協すると思います
|
Re: iniファイルをDxアーカイブから読み込みたい ( No.5 ) |
- 名前:通りすがりの。 日時:2019/10/26 16:14
にこようさん
単に自分が楽だと理由だけで、管理人さんに一般的に求められるとは思いにくい機能をDXライブラリの機能として求めるのはどうかと思うのです。
またGetPrivateProfileInt、GetPrivateProfileString相当の機能を実装してしまうと
いずれどうしてSet版(書き込み版)がないのかという話を言い出す方が出てくるのではないでしょうか?
|
Re: iniファイルをDxアーカイブから読み込みたい ( No.6 ) |
- 名前:にこよう 日時:2019/10/26 18:07
通りすがりの。さん
>単に自分が楽だと理由だけで、管理人さんに一般的に求められるとは思いにくい機能をDXライブラリの機能として求めるのはどうかと思うのです。
一般的にDxライブラリの機能としてあれば便利だと思ったのでスレッドを立てました
それにDxライブラリへの実装が簡単でなければ (tempファイルを作るという方法ですが) 自身で作る予定だったので
私が楽をしたかったわけではありません
>いずれどうしてSet版(書き込み版)がないのかという話を言い出す方が出てくるのではないでしょうか?
確かにその可能性もありますが、マイナー関数をヘッダから探すほどの方がそのような話を持ち出す可能性は低いと思いますし
それは実装しない理由にはならないと思います
実装への反対の意見が多いので、これ以上要求することはやめますが誤解はしてほしくないです
|
Re: iniファイルをDxアーカイブから読み込みたい ( No.7 ) |
- 名前:管理人 日時:2019/10/28 02:36
ご返信が遅くなり申し訳ありません
> アーカイブに隠したかったゲーム内のデータが見られてしまう
> 定期的に参照する場合はtempファイルをしばらく残すことになり、敵などのデータを改変できてしまう
> 予期しない方法で終了すればtempファイルが残ってしまう
> 等の問題があり、正直に言えば余りこの方法で実装したくありませんでした
すみません、そこの部分を気にされるのでしたら独自のデータファイルを用意された方が良いかと思いましたが、
> 一般的にDxライブラリの機能としてあれば便利だと思ったのでスレッドを立てました
確かに便利さという意味であっても良いかも、と思いましたので実装してみます
ただ、今週は全然作業時間が確保できず、実装作業は次の週末となりますので少々お待ちください m(_ _;m
> 紺帽子さん
> 通りすがりの。さん
iniファイルを調べたら『Windows3.1 時代の機能で現在はレジストリやXMLファイルの使用が推奨される』とあったので
私も実装には消極的だったのですが、思えば UnrealEngine4 など最近のソフトでも普通に使用されていますし、
何より現在のDXライブラリがテキストファイルから簡単にパラメータを読み込む機能が無いために
プログラム初心者の方がcppファイルにパラメータを直接書き込んでいるのを脱却するための敷居が
高い状態( 自前でテキストファイルの解析処理を書くか、パラメータエディタの自作( バイナリファイルの場合 )を
しなければならない )だったので、実装することにしました
|
Re: iniファイルをDxアーカイブから読み込みたい ( No.8 ) |
- 名前:にこよう 日時:2019/10/28 22:07
>すみません、そこの部分を気にされるのでしたら独自のデータファイルを用意された方が良いかと思いましたが、
今までのデータは全てバイナリで保存していたのですが、今回の使用目的では(保存データがコロコロ変わってしまうのもあり)
iniがいろいろと便利だったので、中身が見られてしまうことは妥協してtempの方法でやろうとしていました
しかし、Dxライブラリ内でiniの読み込みがあれば今後の他の機能にもiniが使えて便利だと考えていたため要望させていただきました
すみません、独自のデータファイルを作ろうという考えは持っておらず、iniをどう読み込むかを考えていましたm(__)m
>確かに便利さという意味であっても良いかも、と思いましたので実装してみます
>ただ、今週は全然作業時間が確保できず、実装作業は次の週末となりますので少々お待ちください m(_ _;m
ありがとうございます、助かります
本来は余り良くない要望だったようで申し訳ないですm(__)m
|
Re: iniファイルをDxアーカイブから読み込みたい ( No.9 ) |
- 名前:管理人 日時:2019/11/04 00:48
お待たせしました
GetPrivateProfileInt
GetPrivateProfileString
のDXライブラリ版の
GetPrivateProfileIntDx
GetPrivateProfileStringDx
を追加したバージョンをアップしましたので、よろしければダウンロードしてください m(_ _)m
https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用
https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用
https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用
https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.zip // Android版 ARM用
https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM64.zip // Android版 ARM64用
https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用
https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x64.zip // Android版 x64用
https://dxlib.xsrv.jp/temp/DxLibiOSTest.zip // iOS版
https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース
(中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
宣言は以下のようになっています
// GetPrivateProfileString のDXライブラリ版
int GetPrivateProfileStringDx( char *AppName, char *KeyName, char *Default, char *ReturnedString, size_t ReturnedStringBufferBytes, char *IniFilePath, int IniFileCharCodeFormat = -1 /* DX_CHARCODEFORMAT_SHIFTJIS 等、-1 でデフォルト */ ) ;
// GetPrivateProfileInt のDXライブラリ版
int GetPrivateProfileIntDx( char *AppName, char *KeyName, int Default, char *IniFilePath, int IniFileCharCodeFormat = -1 /* DX_CHARCODEFORMAT_SHIFTJIS 等、-1 でデフォルト */ ) ;
本家では nSize となっている引数は ReturnedString の関連だということが分かりにくいので ReturnedStringBufferBytes にしました
( それを言うなら AppName も SectionName の方が良いのでは、という感じですが… )
あと、本家では Shift-JIS 形式のテキストしか対応していませんが IniFileCharCodeFormat の
指定次第で UTF-8 や UTF-16LE 等の Shift-JIS 形式以外の iniファイルでも読み込めます
( ただ、文字列の形式を Shift-JIS 以外にした場合本家のAPIでは正常に読み込めなくなりますが… )
あと、上記の関数は本家より遅いです( 処理時間1.5倍ほど )
( DXアーカイブファイル内に入れた iniファイルを一度ファイルに書き出して本家APIで読み込んでからファイル削除…の場合よりは速いと思いますが… )
加えて iniファイルに大量のパラメータを記載して大量に GetPrivateProfileStringDx などを呼ぶことを考えると
高速に処理できる手段も必要だと思いましたので、メモリに読み込まれた iniファイルのイメージから読み込む関数も追加しました
// GetPrivateProfileStringDx のメモリから読み込む版
int GetPrivateProfileStringDxForMem( char *AppName, char *KeyName, char *Default, char *ReturnedStringBuffer, size_t ReturnedStringBufferBytes, const void *IniFileImage, size_t IniFileImageBytes, int IniFileCharCodeFormat = -1 /* DX_CHARCODEFORMAT_SHIFTJIS 等、-1 でデフォルト */ ) ;
// GetPrivateProfileIntDx のメモリから読み込む版
int GetPrivateProfileIntDxForMem( char *AppName, char *KeyName, int Default, const void *IniFileImage, size_t IniFileImageBytes, int IniFileCharCodeFormat = -1 /* DX_CHARCODEFORMAT_SHIFTJIS 等、-1 でデフォルト */ ) ;
ファイルを丸ごとメモリに読み込んで、読み込んだメモリ領域の先頭アドレスとファイルのサイズを取得するのは
FileRead_fullyLoad, FileRead_fullyLoad_getImage, FileRead_fullyLoad_getSize を使うと便利です
<例>
int IniFileHandle = FileRead_fullyLoad( "test.ini" ) ; // iniファイルをまるごとメモリに読み込み
const void *IniFileImage = FileRead_fullyLoad_getImage( IniFileHandle ) ; // 読み込んだメモリ領域の先頭アドレスを取得
size_t IniFileImageBytes = ( size_t )FileRead_fullyLoad_getSize( IniFileHandle ) ; // iniファイルのサイズを取得
// メモリに読み込んだ iniファイルから情報を取得する
GetPrivateProfileStringDxForMem( "sec1", "key1", "default", Sec1Key1String, sizeof( Sec1Key1String ), IniFileImage, IniFileImageBytes ) ;
GetPrivateProfileStringDxForMem( "sec1", "key2", "default", Sec1Key2String, sizeof( Sec1Key2String ), IniFileImage, IniFileImageBytes ) ;
GetPrivateProfileStringDxForMem( "sec4", "key1", "default", Sec4Key1String, sizeof( Sec4Key1String ), IniFileImage, IniFileImageBytes ) ;
FileRead_fullyLoad_delete( IniFileHandle ) ; // メモリに読み込んだ iniファイルを解放
よろしければお試しください m(_ _)m
|
Re: iniファイルをDxアーカイブから読み込みたい ( No.10 ) |
- 名前:にこよう (解決) 日時:2019/11/04 23:37
実装ありがとうございますm(__)m
正常に読み込めることを確認しました
>あと、本家では Shift-JIS 形式のテキストしか対応していませんが IniFileCharCodeFormat の
>指定次第で UTF-8 や UTF-16LE 等の Shift-JIS 形式以外の iniファイルでも読み込めます
フォーマットの概念はよく理解していないのですが、関数内でどうにかできる問題だったんですね
プロジェクトの関係からShift-JIS形式しか読み込めないものと思っておりました
手動で入力する形式のものがあればこちらを使用するようにします
>高速に処理できる手段も必要だと思いましたので、メモリに読み込まれた iniファイルのイメージから読み込む関数も追加しました
Dxアーカイブ内の物をこちらで処理する必要があるかは、まだわかりませんが
zip圧縮されたiniファイルの読み込みなど他のことに使えそうなので覚えておきます
|