ページ 11

.txtからの数値の読み込みについて

Posted: 2014年8月01日(金) 16:06
by HI魔神
上に2行の文字列、その下に半角スペースで区切られた数値が1行並んだsuuti.txtから数値を読み込むために以下のプログラムを作成しました。
BCPadではこれが正常に動作し終了したのですがVisual Stdio 2010で実行すると20行目二つ目のfopen()でエラーを起こし止まります。
エラーの内容:
GameProg.exe の 0x776efd12 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x41819bad に書き込み中にアクセス違反が発生しました。

どのようにすれば正しく読み込めるのでしょうか?
また、今後数値の列も増やしていくため、その点でも何か問題がありましたら教えてください。

コード:

#include <stdio.h>

int main(void)
{
	
	FILE *fp;
	int  n;
	float r;
	char mozi[2];
	
	 fp = fopen( "suuti.txt", "r" );
	if( fp == NULL ){
		printf( "ファイルが開けません\n" );
	fclose( fp );
		return -1;
	}

	fscanf( fp, "%s", mozi);
	printf( "%s\n", mozi );
	fscanf( fp, "%s", mozi);
	printf( "%s\n", mozi );
	
	for( int i = 0; i < 1 ; i++){
		fscanf( fp, "%f", &r);
		printf( "%lf\n", r );

		fscanf( fp, "%f", &r);
		printf( "%lf\n", r );

		fscanf( fp, "%d", &n);
		printf( "%d\n", n );

		for( int j = 0; j < 8; j++ ){
			fscanf( fp, "%d", &n);
		printf( "%d\n", n );
		}

		fscanf( fp, "%d", &n);
		printf( "%d\n", n );
	}
	fclose( fp );
  return 0;
}

Re: .txtからの数値の読み込みについて

Posted: 2014年8月01日(金) 16:25
by box
HI魔神 さんが書きました:上に2行の文字列、その下に半角スペースで区切られた数値が1行並んだsuuti.txtから数値を読み込むために以下のプログラムを作成しました。
そのテキストファイルの具体例を見せてください。
HI魔神 さんが書きました: BCPadではこれが正常に動作し終了したのですがVisual Stdio 2010で実行すると20行目二つ目のfopen()でエラーを起こし止まります。
20行目二つ目のfopen()
というのがよくわかりません。
20行目二つ目のfscanf()
のことでしょうか。

Re: .txtからの数値の読み込みについて

Posted: 2014年8月01日(金) 23:07
by HI魔神
情報があいまいでしたね。失礼しました。
利用したテキストファイルは以下のような感じです。

コード:

下のデータの説明文
---------------------------区切り線------------------------------

100 0 2 1 1 1 1 1 1 1 1 1
もう一つの表現のほうは 20行目のfcsanf() という意味であってます。

Re: .txtからの数値の読み込みについて

Posted: 2014年8月02日(土) 00:04
by みけCAT
moziは2バイトしか確保されていないので、
「下のデータの説明文」「---------------------------区切り線------------------------------」
という長いデータを読み込ませるとバッファオーバーランします。
テキストファイルの1行目と2行目を1バイトにしてください。(0バイトだと読み飛ばされるのでダメ、ひらがななどは複数バイトなのでダメ)
もしくは、moziの要素数を大きくしてください。

Re: .txtからの数値の読み込みについて

Posted: 2014年8月02日(土) 00:05
by みけCAT
ファイルが開けていない場合にもfcloseしているのも気になりました。

Re: .txtからの数値の読み込みについて

Posted: 2014年8月02日(土) 11:22
by HI魔神
ありがとうございます。メモリのオーバーフローが原因だったんですね。
BCPadでなぜ動いたのかは不思議ですがちゃんと容量を確保すれば問題はなさそうです。
fcloseの点もご指摘ありがとうございました。return -1で関数を終了するので失敗したらfclose()は実行されません。

Re: .txtからの数値の読み込みについて

Posted: 2014年8月02日(土) 11:31
by みけCAT
HI魔神 さんが書きました:return -1で関数を終了するので失敗したらfclose()は実行されません。
HI魔神 さんが書きました:

コード:

	if( fp == NULL ){
		printf( "ファイルが開けません\n" );
	fclose( fp );
		return -1;
	}
まともなコンパイラならfclose()が実行されると思うのですが…?