トップページ > 記事閲覧
FileRead_getsについて
名前:サイゲン 日時: 2019/01/07 23:08

FileRead_getsをもちいて.datファイル、あるいは.txtファイルの中身を一行ずつ読み込んでいくということを行っているのですが、どうしても「例外がスローされました」や「書き込み中にアクセス違反が発生しました」となって止まってしまいます。 また、うまく読み込めたとしてもDrawFormatStringで描写すると文字化けが生じたり、ファイル中に書いてないものが出たりします。 どうすれば例外のスローが発生しなくなったり文字化けが防がれるでしょうか? ちなみに,.datファイル、.txtファイルは文字コードUTF-8にして自分で製作しました。 以下,ファイルを読み込んで処理を行う部分のソースです。 void GameInit(char Answer[][256], char InputAnswer[][256]) { int AnswerHandle, InputAnswerHandle; int i;     //拡張子を.txtに変えても例外のスローが生じた AnswerHandle = FileRead_open("Answer.dat"); InputAnswerHandle = FileRead_open("InputAnswer.dat"); for (i = 0; i < 19; i++) { FileRead_gets(Answer[i], 256, AnswerHandle); FileRead_gets(InputAnswer[i], 256, InputAnswerHandle); } FileRead_close(AnswerHandle); FileRead_close(InputAnswerHandle); miss = 0; total = 0; FontHandle = CreateFontToHandle(NULL, 20, 7); LIGHTBLUE = GetColor(0, 255, 255); RED = GetColor(255, 0, 0); BLACK = GetColor(0, 0, 0); WHITE = GetColor(255, 255, 255); YELLOW = GetColor(255, 255, 0); ClearInputCharBuf(); }
メンテ

Page: 1 |

Re: FileRead_getsについて ( No.1 )
名前:サイゲン 日時:2019/01/07 23:27

追記 デバッグしてみると、途中で「文字列中に無効な文字があります」のメッセージがありました。 なお、それぞれのデータの中身は次の通りです Answer.txt ロックバンドは、楽しい。 可能性なら、いくらでもある。 それでも、それでも明日を探す。 行き着いた先に、何もなくても。 事件ならとっくに起きてる。 端役、伏兵、大暴れ。←文字列中に無効な文字がありますのメッセージ どこを晒すか、どこを隠すか。←文字列中に無効な文字がありますのメッセージ かくして万事は気分の仕業。 ナイフを持つその、本当の意味。 一回だけしかないなら、一回だけで十分だ。 無我夢中に、理由は? 喜怒哀楽quartet'何処へ行く? いつかは必ず終わるから。 死ねない理由を見つけ出せ。 4年後もどうせ君が好き。 その才能に用がある。 君の常識に用はない。 ざまみろ、これが僕らの歌だ。 ロックバンドは、正しくない。 InputAnswer.txt rokkubandoha,tanosii. kanouseinara,ikurademoaru. soredemo,soredemoasitawosagasu. ikituitasakini,nanimonakutemo. zikennnaratokkuniokiteru. hayaku,hukuhei,ooabare. dokowosarasuka,dokowokakusuka. kakusitebanzihakibunnnosiwaza. naihuwomotusono,hontounoimi. ikkaidakesikanainara,ikkaidakedezyuubunda. mugamutyuuni,riyuuha? kidoairakuquarutet'dokoheiku? itukahakanarazuowarukara. sinenairiyuuwomitukedase. 4nengomodousekimigasuki. sonosainouniyougaaru. kiminozyousikiniyouhanai. zamamiro,koregabokuranoutada. rokkubandoha,tadasikunai.
メンテ
Re: FileRead_getsについて ( No.2 )
名前:管理人 日時:2019/01/08 00:23

こちらで以下のようなサイゲンさんのプログラムを使用する形で Answer.txt と InputAnswer.txt の中身を画面に表示するプログラムを組んでみましたが、正常に動作しました #include "DxLib.h" char AnswerData[ 19 ][ 256 ]; char InputAnswerData[ 19 ][ 256 ]; int miss; int total; int FontHandle; int LIGHTBLUE; int RED; int BLACK; int WHITE; int YELLOW; void GameInit(char Answer[][256], char InputAnswer[][256]) { int AnswerHandle, InputAnswerHandle; int i; //拡張子を.txtに変えても例外のスローが生じた AnswerHandle = FileRead_open("Answer.txt"); InputAnswerHandle = FileRead_open("InputAnswer.txt"); for (i = 0; i < 19; i++) { FileRead_gets(Answer[i], 256, AnswerHandle); FileRead_gets(InputAnswer[i], 256, InputAnswerHandle); } FileRead_close(AnswerHandle); FileRead_close(InputAnswerHandle); miss = 0; total = 0; FontHandle = CreateFontToHandle(NULL, 20, 7); LIGHTBLUE = GetColor(0, 255, 255); RED = GetColor(255, 0, 0); BLACK = GetColor(0, 0, 0); WHITE = GetColor(255, 255, 255); YELLOW = GetColor(255, 255, 0); ClearInputCharBuf(); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int i ; ChangeWindowMode( TRUE ) ; SetGraphMode( 750, 400, 32 ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // ファイル読み込み GameInit( AnswerData, InputAnswerData ) ; // 画面に表示 for( int i = 0; i < 19 ; i ++ ) { DrawString( 0, i * 16, AnswerData[ i ], GetColor( 255,255,255 ) ) ; DrawString( 350, i * 16, InputAnswerData[ i ], GetColor( 255,255,255 ) ) ; } // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } こちらに私の環境でコンパイルした実行ファイルをアップしましたので、よろしければ サイゲンさんの環境でも正常に動作するか試してみてください m(_ _)m https://dxlib.xsrv.jp/temp/FileRead_getsTest.zip 原因についてですが、メモリの不正なアクセスが発生してしまっているような気がします GameInit の呼び出し部分はどのようになっていますでしょうか?
メンテ
Re: FileRead_getsについて ( No.3 )
名前:サイゲン 日時:2019/01/08 00:42

管理人様 返信ありがとうございます。 早速実行可能ファイルを試そうとしたら「ファイルにウイルスまたは望ましくないソフトウェアが含まれているため、操作は正常に完了しませんでした」と表示されました・・・。 ソースですが、すべて掲載すると非常に多いため、GameInitの呼び出し部分だけを掲載します。 #include "Dxlib.h" int gstate = GAME_TITLE; int total, miss, flag, FontHandle, RED, LIGHTBLUE, BLACK, WHITE, YELLOW; // プログラムは WinMain から始まります int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); SetBackgroundColor(255, 255, 255); if (DxLib_Init() == -1) return -1; // エラーが起きたら直ちに終了 SetDrawScreen(DX_SCREEN_FRONT); while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) { switch (gstate) { case GAME_TITLE: DrawGameTitle(); break; case GAME_MAIN: DrawGameMain(); break; case GAME_RESULT: DrawGameResult(); break; default: break; } } DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 } void GameInit(char Answer[][256], char InputAnswer[][256]) { int AnswerHandle, InputAnswerHandle; int i; AnswerHandle = FileRead_open("Answer.dat"); InputAnswerHandle = FileRead_open("InputAnswer.dat"); for (i = 0; i < 19; i++) { FileRead_gets(Answer[i], 256, AnswerHandle); FileRead_gets(InputAnswer[i], 256, InputAnswerHandle); } FileRead_close(AnswerHandle); FileRead_close(InputAnswerHandle); miss = 0; total = 0; FontHandle = CreateFontToHandle(NULL, 20, 7); LIGHTBLUE = GetColor(0, 255, 255); RED = GetColor(255, 0, 0); BLACK = GetColor(0, 0, 0); WHITE = GetColor(255, 255, 255); YELLOW = GetColor(255, 255, 0); ClearInputCharBuf(); } void DrawGameMain() { int Track, photo; int now, past; char Answer[5][256]; char InputAnswer[5][256]; int MainHandle; int Number; GameInit(Answer, InputAnswer); Track = GetRand(2); if (flag == 1) { switch (Track) { case 0: PlaySoundFile("シュガーソングとビターステップ [Live].mp3", DX_PLAYTYPE_BACK); break; case 1: PlaySoundFile("場違いハミングバード [Live].mp3", DX_PLAYTYPE_BACK); break; case 2:PlaySoundFile("Own Civilization(nano-mile met) [Live].mp3", DX_PLAYTYPE_BACK); break; } } else if (flag == 0) { switch (Track) { case 0: PlaySoundFile("Catch up, latency.mp3", DX_PLAYTYPE_BACK); break; case 1: PlaySoundFile("Invisible Sensation.mp3", DX_PLAYTYPE_BACK); break; case 2:PlaySoundFile("君の瞳に恋してない.mp3", DX_PLAYTYPE_BACK); break; } } else { switch (Track) { case 0: PlaySoundFile("静謐甘美秋暮抒情 [Live].mp3", DX_PLAYTYPE_BACK); break; case 1: PlaySoundFile("オーケストラを観にいこう [Live].mp3", DX_PLAYTYPE_BACK); break; case 2:PlaySoundFile("サンポサキマイライフ [Live].mp3", DX_PLAYTYPE_BACK); break; } } photo = GetRand(4); switch (photo) { case 0: MainHandle = LoadGraph("バズリズム.jpg"); break; case 1: MainHandle = LoadGraph("君瞳1.jpg"); break; case 2: MainHandle = LoadGraph("君瞳2.jpg"); break; case 3: MainHandle = LoadGraph("ライブ 4.jpg"); break; case 4: MainHandle = LoadGraph("ライブ.jpg"); break; } if (flag != 2) { Number = 5; now = GetRand(18); for (int i = 0; i < Number; i++) { ClsDrawScreen(); if (GameMain(MainHandle, Number, i, now, Answer, InputAnswer) == -1) break; ScreenFlip(); do { past = now; now = GetRand(18); } while (now == past); } } else { Number = 100; now = GetRand(18); for (int i = 0; i < Number; i++) { ClsDrawScreen(); GameMain(MainHandle, Number, i, now, Answer, InputAnswer); ScreenFlip(); do { past = now; now = GetRand(18); } while (now == past); } } WaitTimer(1500); StopSoundFile(); gstate = GAME_RESULT; }
メンテ
Re: FileRead_getsについて ( No.4 )
名前:サイゲン(解決) 日時:2019/01/08 01:41

管理人様 一度DXライブラリ立ち上げた直後にファイル読み込みを行う(その他のパラメータの初期化は一切なし)に変更したところ正常に動作したので、それを元にGameInitの書き直しなどを行なったら無事に正常に動作しました。
メンテ
Re: FileRead_getsについて ( No.5 )
名前:管理人 日時:2019/01/08 23:50

> 早速実行可能ファイルを試そうとしたら「ファイルにウイルスまたは望ましくないソフトウェアが含まれているため、操作は正常に完了しませんでした」と表示されました・・・。 DXライブラリで作成したアプリはウイルスやマルウェアと誤判定されやすいようなので、 そのような場合は一旦セキュリティ機能をOFFにしてから実行してみてください m(_ _;m > 一度DXライブラリ立ち上げた直後にファイル読み込みを行う(その他のパラメータの初期化は一切なし)に変更したところ正常に動作したので、それを元にGameInitの書き直しなどを行なったら無事に正常に動作しました。 載せていただいたプログラムを拝見する限りでは、原因はこちらです char Answer[5][256]; char InputAnswer[5][256]; GameInit の中で Answer と InputAnswer にそれぞれ 19個の文章を読み込んでいますが、 こちらでは 5個分の配列しか無いため、メモリの不正なアクセスが発生してしまっています 変更された結果こちらが char Answer[19][256]; char InputAnswer[19][256]; となっているのでしたら問題ありません もし 5 のままでしたら、正常に動作しているように見えるだけ、ということになります ( メモリの不正なアクセスは100%検出されるわけではない太刀の悪いバグ( 不正なアクセス先がたまたまアクセスしても 問題のない箇所だった場合にエラー判定されない等 )なので、プログラムを変更することでメモリの配置が変化して、 一時的にエラーが発生しなくなったりします ) よろしければご確認ください m(_ _)m
メンテ

Page: 1 |

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

   クッキー保存