トップページ > 記事閲覧
FileRead_getsの引数について
名前:oda 日時: 2025/01/01 10:21

お世話になっております。 開発中のゲームでFileRead_getsを使っているところがあるのですが、 以下のような場合に問題が起きるでしょうか? こちらの環境では以下のどれでも問題起きないのですが、極一部の海外のテストプレイヤーの環境では 詳細はわかりませんが、Bの場合なにか動作が怪しいっぽいのです。 こちらでは再現しないので、読み込まれたテキストがどうなっているか戻り値がどうなっているか等はわかりませんが、 各行の最初の1文字しか読み込まれていないような感じです。 Bでソースコードを書いてしまった箇所がいくつかあり悩んでいます。 @引数で指定されたサイズがちょうど同じの場合 char strStr[480]; int iRet = FileRead_gets( strStr, 480, iFileHandle ) ; A引数で指定されたサイズが小さめの場合 char strStr[480]; int iRet = FileRead_gets( strStr, 320, iFileHandle ) ; B引数で指定されたサイズが大きい場合 char strStr[480]; int iRet = FileRead_gets( strStr, 512, iFileHandle ) ; ※ファイルの内容は以下の通りで --------------------- 3200 20 0 2400 20 0 1600 20 0 2400 20 0 2000 20 0 500 20 0 2400 20 0 2400 20 0 2000 20 0 2000 30 50 1600 30 50 1500 30 55 --------------------- みたいな感じで、1行毎の文字数は↓のstrStr[480]には余裕に入りきります。 それで1行目を short i, j, k; sscanf(strStr, "%hd %hd %hd", &i,&j,&k); で読み込むと結果が i = 3; j = 0; k = 0; となっているようなので、FileRead_getsで最初の1文字しか読み込めていないのか、sscanfのほうが異常なのかわかりかねております。 sscanfに問題があるとは思えないので、FileRead_getsの引数が異常で1文字しか読めていない気がしました。 以上よろしくお願いいたします。
メンテ

Page: 1 |

Re: FileRead_getsの引数について ( No.1 )
名前:oda 日時:2025/01/01 20:05

あの後進展があって、 int iRet = FileRead_gets( strStr, 480, iFileHandle ) ; で読み込んだ文字列が "3200 20 0" ではなくて、 "3 2 0 0 2 0 0 " と1文字ごとに半角スペースが入っていることがわかりました。 他の似たようなファイルだとこのような事は起きないので謎な現象です。 一部の環境でしか起きないのも謎です。 どのような原因が考えられますでしょうか? 解決方法はあるのでしょうか? 以上よろしくお願いいたします。
メンテ
Re: FileRead_getsの引数について ( No.2 )
名前:管理人 日時:2025/01/01 22:24

リファレンスには載っていないのですが、FileRead_gets などで読み込むテキストファイルの 文字コード形式を指定するための関数 FileRead_set_format というものがありまして // ファイルの文字コード形式を設定する( テキストファイル用 ) // FileHandle : ファイルハンドル // CharCodeFormat : 文字コード形式 // DX_CHARCODEFORMAT_SHIFTJIS // シフトJISコード // DX_CHARCODEFORMAT_GB2312 // 簡体字文字コード // DX_CHARCODEFORMAT_UHC // ハングル文字コード // DX_CHARCODEFORMAT_BIG5 // 繁体文字コード // DX_CHARCODEFORMAT_UTF16LE // UTF-16 リトルエンディアン // DX_CHARCODEFORMAT_UTF16BE // UTF-16 ビッグエンディアン // DX_CHARCODEFORMAT_WINDOWS_1252 // 欧文(ラテン文字の文字コード) // DX_CHARCODEFORMAT_ISO_IEC_8859_15 // 欧文(ラテン文字の文字コード) // DX_CHARCODEFORMAT_UTF8 // UTF-8 // DX_CHARCODEFORMAT_ASCII // アスキー文字コード // DX_CHARCODEFORMAT_UTF32LE // UTF-32 リトルエンディアン // DX_CHARCODEFORMAT_UTF32BE // UTF-32 ビッグエンディアン int FileRead_set_format( int FileHandle, int CharCodeFormat ) ; 通常はテキストファイルの文字コード形式を自動判定するのですが、原因は不明ですがその自動判定が 正常に完了しない環境があるのかもしれません なので、FileRead_gets で読み込みを開始する前にこの関数で読み込むファイルの 文字コード形式を明示的に指定することで本件の問題を解消することができると思います 一文字ごとに半角スペースが入ってしまうとなるとテキストファイルの文字コード形式は UTF-16 LE や UTF-16 BE となっている可能性が高いと思いますが、件のテキストファイルの 文字コード形式は何でしょうか?
メンテ
Re: FileRead_getsの引数について ( No.3 )
名前:oda 日時:2025/01/02 08:58

管理人様 ご回答ありがとうございます。 テキストはUTF8です。 教えていただいた通りFileRead_openの後にすぐ FileRead_set_format(iFileHandle, DX_CHARCODEFORMAT_UTF8); をやってみましたがそれでも結果は同じく1文字ごとに半角スペースが入っていました。 他のテキストも全部UTF8で、他は異常が起きなくて、なぜかそのファイルだけ異常で、 しかもそのファイルも場合によっては正しく読み込まれたりもするとのことです。(条件は不明) ひとまず、このファイルから読み込んだ文字列は 半角スペースを削除してから使う事で応急処置をしようかと思います。
メンテ
Re: FileRead_getsの引数について ( No.4 )
名前:管理人 日時:2025/01/02 23:40

ご情報ありがとうございます FileRead_set_format を使用しても駄目でしたか… よろしければ件のファイルをメールでこちらのアドレスに BQE00322(あっとまーく)nifty.com ( (あっとまーく) を @ に置き換えてください ) に送っていただけないでしょうか? 直接手元で現象が再現すれば原因も分かると思いますので… m(_ _)m
メンテ
Re: FileRead_getsの引数について ( No.5 )
名前:管理人 日時:2025/01/04 00:06

テキストファイルをお送りいただきありがとうございます ファイルを拝見する限りでは特に気になる点は無く、本件の現象が何故発生するのかは分かりませんでした… こちらもリファレンスには載っていない関数なのですが、実行時に使用する文字コード形式は SetUseCharCodeFormat という 関数で指定することが出来、この関数による指定が無い場合は実行時のPCの言語設定によって自動的に使用する 文字コード形式が決定されるようになっています ( 例えば日本語環境ではデフォルトでは DX_CHARCODEFORMAT_SHIFTJIS が自動設定されます( 直に確認はできて  いませんが例えばハングル語環境ではデフォルトで DX_CHARCODEFORMAT_UHC が設定される…はず ) ) // 文字列の引数の文字コード形式を設定する( 文字列描画系関数とその他一部関数を除く ) // CharCodeFormat : 文字コード形式 // DX_CHARCODEFORMAT_SHIFTJIS // シフトJISコード // DX_CHARCODEFORMAT_GB2312 // 簡体字文字コード // DX_CHARCODEFORMAT_UHC // ハングル文字コード // DX_CHARCODEFORMAT_BIG5 // 繁体文字コード // DX_CHARCODEFORMAT_UTF16LE // UTF-16 リトルエンディアン // DX_CHARCODEFORMAT_UTF16BE // UTF-16 ビッグエンディアン // DX_CHARCODEFORMAT_WINDOWS_1252 // 欧文(ラテン文字の文字コード) // DX_CHARCODEFORMAT_ISO_IEC_8859_15 // 欧文(ラテン文字の文字コード) // DX_CHARCODEFORMAT_UTF8 // UTF-8 // DX_CHARCODEFORMAT_ASCII // アスキー文字コード // DX_CHARCODEFORMAT_UTF32LE // UTF-32 リトルエンディアン // DX_CHARCODEFORMAT_UTF32BE // UTF-32 ビッグエンディアン int SetUseCharCodeFormat( int CharCodeFormat ) ; 言語環境によって本件の現象が発生したりしなかったりする可能性がある場合は、こちらの関数で明示的に 文字コード形式を指定することで直るかもしれません m(_ _)m ( 尚、例えばこの関数で SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 ); を実行して UTF-8 を使用する 設定にした場合は、LoadGraph や DrawString などの文字列を渡す関数全てで渡す文字列の文字コード形式を UTF-8 にする必要がありますのでご注意ください )
メンテ
Re: FileRead_getsの引数について ( No.6 )
名前:oda 日時:2025/01/05 12:56

ご返答ありがとうございます。 SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 ); をDxLib_Init() の前にやるようにしてみたところ、解決しませんでしたが、新たに分かったことがあります。 入っている文字が半角スペースだと思っていたのですが、実際は違ったようで、 謎の文字が入っていました。 ゲーム中表示できない文字(自分の作ったゲーム内フォントを使ったため)なので空白が表示されていたようです。 読み込んだものを別のファイルに出力してみたところ、 エイチティーティーピーエス://hensa40.cutegirl.jp/wp-content/uploads/2017/09/chartab_e.gif この画像でいう「80」の行の左端の文字が入っていました。Cと=を重ねたようなやつです。 これが入っていたのだと思われます。 それと出力したテキストはなぜか「UTF8」じゃなくて「ANSI」になっていました。 とりあえず、読み込んだテキストから0〜9の数値と半角スペース以外取り除く対応を入れたら解決はできそうです。 以上よろしくお願いいたします。
メンテ
Re: FileRead_getsの引数について ( No.7 )
名前:管理人 日時:2025/01/05 21:29

SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 ); でも駄目でしたか… 詳しい検証のご情報ありがとうございます ただ、何故 0x80 の文字が入ってしまうのかは不明です 試しに別言語環境を擬似的に再現した状態で FileRead_gets を実行してみたのですが、 間に 0x80 の文字や何か別の文字が入ってしまうという現象は再現できませんでした > それと出力したテキストはなぜか「UTF8」じゃなくて「ANSI」になっていました。 恐らく UTF8 ではないと表現できない文字が一切入っていないので ANSI になっているのではないかと思います ( 文字コード UTF8 も、A〜Z a〜z 0〜9 などの基本的な文字は ANSI とコードが共通なので基本的な文字だけしか 含まれていないテキストファイルは作成者が UTF8 ファイルのつもりでも、自動判定では ANSI と区別できないので ) > とりあえず、読み込んだテキストから0〜9の数値と半角スペース以外取り除く対応を入れたら解決はできそうです。 申し訳ありません、そちらの方法で解決していただくしか方法が無いかもしれません… 可能性は低いと思いますが、もしかしたらこちらの暫定最新版では本件の現象が直っているかもしれませんので、 もし暫定最新版をお使いではありませんでしたらこちらをお試しになってみてください 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 12 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: FileRead_getsの引数について ( No.8 )
名前:oda 日時:2025/01/07 18:47

ご回答ありがとうございます。 暫定最新版を使ってテスターの方に確認していただいたところ、直っていました。 問題が起きていたバージョンは3.14でした。 すみません。バージョンを新しくするだけで解決する問題だったですね。 今後は定期的にバージョンを新しくするようにしたいと思います。
メンテ
Re: FileRead_getsの引数について ( No.9 )
名前:管理人 日時:2025/01/09 04:53

最新版で直っていたとのことで何よりです > すみません。バージョンを新しくするだけで解決する問題だったですね。 > 今後は定期的にバージョンを新しくするようにしたいと思います。 新しいバージョンで少し変化した処理によって今までに無かった不具合が 発生したりすることもありますので、今回のように何か問題が発生した際に 『最新版では直ってるかも』くらいの感覚で最新バージョンに更新して頂くのが 丁度良いかもしれません
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存