トップページ > 記事閲覧
FileRead_getsでファイルが正しく読めない
名前:ちきしんぐ 日時: 2023/06/25 05:21

お世話になっております。 SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8)を設定してutf8で書かれたテキストをFileRead_getsで読み込むと以下のような現象が起きます。 1.ファイルに書かれている内容と関係ない文字になってしまう 2.本来あるはずの文字列が読み込まれていない 全てのテキストで起きるのではなく特定のテキストで起きており、 対象のテキストの内容の行を減らすと問題なく読み込めたりするためはっきりした原因がわかりません。 設定が足りないのかどうかわからないので、ご教授頂けると幸いです。 #include "DxLib.h" #include "F.h" #include <fstream> #include <string> constexpr int textInputBuffSize = 1024; int WINAPI WinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ LPSTR, _In_ int) { // このプログラムではUTF-8をデフォルトで使用する SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8); SetOutApplicationLogValidFlag(false);//logを生成しない // ウィンドウモード ChangeWindowMode(true); // 非アクティブでも動くようにする SetAlwaysRunFlag(true); // タイトル変更 SetMainWindowText("test"); Fps fps; if (DxLib_Init() == -1) return -2; bool once = true; SetDrawScreen(DX_SCREEN_BACK);//裏描画 while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) { //更新 fps.Update(); //調整 fps.Wait(); if (once) { std::ofstream outputFile(u8"test2_out.txt"); int fileHandle = FileRead_open(u8"test2.txt"); char buff[textInputBuffSize]; std::string tmpText; if (!fileHandle || !outputFile) return 0; while (!FileRead_eof(fileHandle)) { // 一行読みだす if (-1 == FileRead_gets(buff, textInputBuffSize, fileHandle)) break; tmpText = buff; outputFile << tmpText << std::endl; } FileRead_close(fileHandle); outputFile.close(); once = false; } //fps描画 fps.Draw(); } DxLib_End(); return 0; }
メンテ

Page: 1 |

Re: FileRead_getsでファイルが正しく読めない ( No.1 )
名前:naohiro19 日時:2023/06/25 11:21

<ChatGPTからの回答文> この現象が発生する原因は、ファイルの読み込み時に使用する文字コードの指定に関連しています。 SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8)は、DxLibで使用する文字コードをUTF-8に設定する関数ですが、 FileRead_gets関数には影響を与えません。 FileRead_open関数は、デフォルトではShift_JIS(CP932)の文字コードでファイルを読み込むため、 UTF-8で書かれたファイルを正しく読み込むことができません。 そのため、読み込んだ文字列が正しく表示されないか、関係ない文字が表示される場合があります。 UTF-8で書かれたテキストファイルを正しく読み込むには、FileRead_open関数の第二引数に`DX_CHARSET_UTF8`を指定する必要があります。 以下のように修正してみてください: int fileHandle = FileRead_open(u8"test2.txt", DX_CHARSET_UTF8); これにより、UTF-8で書かれたテキストファイルが正しく読み込まれるはずです。 この変更を行うことで、特定のテキストで起きていた問題が解決するか確認してください。 なお、`FileRead_open`関数の第二引数を指定することで、ファイルの文字コードを明示的に指定することができます。
メンテ
Re: FileRead_getsでファイルが正しく読めない ( No.2 )
名前:ちきしんぐ 日時:2023/06/25 16:35

FileRead_open関数の第二引数は非同期読み込みを行うかどうかなので、ChatGPT間違ってますね......
メンテ
Re: FileRead_getsでファイルが正しく読めない ( No.3 )
名前:管理人 日時:2023/06/26 00:28

ちきしんぐさんのプログラムが手元の環境ではうまくコンパイルできなかったので fopen, fwrite, fclose を使用するこちらのコードでテストしてみたのですが #include "DxLib.h" #include <string> constexpr int textInputBuffSize = 1024; int WINAPI WinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ LPSTR, _In_ int) { // このプログラムではUTF-8をデフォルトで使用する SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8); // ウィンドウモード ChangeWindowMode(true); if (DxLib_Init() == -1) return -2; FILE *fp = fopen( "test2_out.txt", "wb" ); int fileHandle = FileRead_open((char *)u8"test2.txt"); char buff[textInputBuffSize]; if( fileHandle && fp ) { while (!FileRead_eof(fileHandle)) { // 一行読みだす if (-1 == FileRead_gets(buff, textInputBuffSize, fileHandle)) break; fwrite( buff, 1, strlenDx( buff ), fp ); fprintf( fp, "\r\n" ) ; } FileRead_close(fileHandle); fclose( fp ); } DxLib_End(); return 0; } 幾つかのファイルを試してみた限りでは問題なく test2_out.txt に test2.txt と 同じ内容が出力されました > 全てのテキストで起きるのではなく特定のテキストで起きており、 > 対象のテキストの内容の行を減らすと問題なく読み込めたりするためはっきりした原因がわかりません。 お手数で申し訳ありませんが正常に読み込めない『特定のテキスト』をご提供頂けないでしょうか? ( 不具合を手元で確認できないと修正のしようがありませんので… m(_ _;m ) > naohiro19さん 以前も申し上げましたが ChatGPT の答えは正しくないことが多いので 回答をそのまま書き込まれるのは控えた方が良いと思います
メンテ
Re: FileRead_getsでファイルが正しく読めない ( No.4 )
名前:ちきしんぐ 日時:2023/06/26 01:31

管理人さんのコードで試したところ変わらず現象が発生することを確認しました。 FileRead_open、FileRead_gets、FileRead_closeを使わずfopen、fgets、fcloseを使ったところ問題なく読み込めることを確認いたしました。 > お手数で申し訳ありませんが正常に読み込めない『特定のテキスト』をご提供頂けないでしょうか? どうやって『特定のテキスト』をお送りしたらいいでしょうか。 制作中のゲームのテキストのため不特定多数の方に見られる方法以外でお送りしたいです。
メンテ
Re: FileRead_getsでファイルが正しく読めない ( No.5 )
名前:管理人 日時:2023/06/26 22:57

なんと、fgets では正常に読み込めたのですね > どうやって『特定のテキスト』をお送りしたらいいでしょうか。 > 制作中のゲームのテキストのため不特定多数の方に見られる方法以外でお送りしたいです。 zipファイルに圧縮した上でこちらのメールアドレス BQE00322(あっとまーく)nifty.com ( (あっとまーく) を @ に置き換えてください ) に添付ファイルとして送って頂ければと思います m(_ _)m
メンテ
Re: FileRead_getsでファイルが正しく読めない ( No.6 )
名前:ちきしんぐ 日時:2023/06/26 23:41

記載いただいた。メールアドレスに読み込めなかったテキストをお送りいたしました。 ご確認お願い致します。
メンテ
Re: FileRead_getsでファイルが正しく読めない ( No.7 )
名前:管理人 日時:2023/06/29 01:10

メールありがとうございます、手元でもテキストファイルが正常に出力されない事を確認しました テキストファイルの文字フォーマットの判定処理が件のテキストファイルの文字フォーマットが UTF-8 であると判定できていなかったことが原因でした 判定処理を修正するのが一番良いのですが、現在の仕組みだと簡単には直せそうにないので 申し訳ありませんが FileRead_open で開いたファイルの文字フォーマットが 何であるかを明示的に指定するための関数 FileRead_set_format を 使用して解決してください m(_ _;m // ファイルを開く int fileHandle = FileRead_open(u8"test2.txt"); // 開いたファイルの文字フォーマットは UTF-8 であると明示的に指定する FileRead_set_format(fileHandle, DX_CHARCODEFORMAT_UTF8); FileRead_open の後に FileRead_set_format(fileHandle, DX_CHARCODEFORMAT_UTF8); を 実行することで正常に読み込めるようになります m(_ _)m
メンテ
Re: FileRead_getsでファイルが正しく読めない ( No.8 )
名前:ちきしんぐ 日時:2023/06/29 02:17

ありがとうございます!問題なく読み込めるようになったのを確認しました。 追加で質問をしたいです。 バッファーの大きさが10で「あいうえおかきくけこ」という文字列を読んだ時に、 fgetsではバッファいっぱいまで読み込まれますが、 FileRead_getsでは読み込んだ文字バイトが切れてしまう場合、その直前までの文字を読み込むみたいですが仕様でしょうか? 仕様であれば、fgetsみたいにバッファいっぱいまで読み込むことが出来る関数があったりしますでしょうか?
メンテ
Re: FileRead_getsでファイルが正しく読めない ( No.9 )
名前:管理人 日時:2023/06/30 02:29

> バッファーの大きさが10で「あいうえおかきくけこ」という文字列を読んだ時に、 > fgetsではバッファいっぱいまで読み込まれますが、 > FileRead_getsでは読み込んだ文字バイトが切れてしまう場合、その直前までの文字を読み込むみたいですが仕様でしょうか? 手元でバッファーの大きさが 10 の配列に対して「ABCDEFGHIJ」というテキストファイルを fgets で 読み込んだ際にバッファーには「ABDEFGHI」が読み込まれ、配列の要素番号 9 には 0 が代入されました( 10文字目の J は読み込まれませんでした ) FileRead_gets も同様に「ABDEFGHI」が読み込まれ、配列の要素番号 9 には 0 が代入されました( 10文字目の J は読み込まれませんでした ) fgets と FileRead_gets は同様の動作をしていると思うのですが、ちきしんぐさんの環境では動作が異なるのでしょうか?
メンテ
Re: FileRead_getsでファイルが正しく読めない ( No.10 )
名前:ちきしんぐ 日時:2023/07/01 01:24

半角文字の場合はどちらともバッファいっぱいまで読み込まれるのを確認しました。 utf-8の全角などの数バイト文字の場合、FileRead_getsがバッファいっぱいまで読み込んでくれませんでした。
メンテ
Re: FileRead_getsでファイルが正しく読めない ( No.11 )
名前:管理人 日時:2023/07/01 22:29

なるほど、全角文字の場合だったのですね > fgetsではバッファいっぱいまで読み込まれますが、 > FileRead_getsでは読み込んだ文字バイトが切れてしまう場合、その直前までの文字を読み込むみたいですが仕様でしょうか? はい、仕様となります 全角文字の場合は、例えば 3バイトで 1文字を表す場合で、残りのバッファが 2バイトしかない場合は 3バイト中の 2バイトだけバッファに格納することはなく、一つ前の文字で読み込みは止まります > 仕様であれば、fgetsみたいにバッファいっぱいまで読み込むことが出来る関数があったりしますでしょうか? 文字の区切りや改行など関係なく単純にバッファいっぱいに読み込みたいということでしたら、 FileRead_gets ではなく FileRead_read が適しています <FileRead_read> https://dxlib.xsrv.jp/function/dxfunc_other.html#R19N6
メンテ
Re: FileRead_getsでファイルが正しく読めない ( No.12 )
名前:ちきしんぐ(解決済み) 日時:2023/07/03 10:16

仕様なのですね、承知いたしました。 対応ありがとうございました!
メンテ

Page: 1 |

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

   クッキー保存