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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
HI魔神
記事: 30
登録日時: 12年前
住所: 福井(大都会)

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

#1

投稿記事 by HI魔神 » 11年前

上に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;
}

box
記事: 2002
登録日時: 14年前

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

#2

投稿記事 by box » 11年前

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

HI魔神
記事: 30
登録日時: 12年前
住所: 福井(大都会)

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

#3

投稿記事 by HI魔神 » 11年前

情報があいまいでしたね。失礼しました。
利用したテキストファイルは以下のような感じです。

コード:

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

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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#4

投稿記事 by みけCAT » 11年前

moziは2バイトしか確保されていないので、
「下のデータの説明文」「---------------------------区切り線------------------------------」
という長いデータを読み込ませるとバッファオーバーランします。
テキストファイルの1行目と2行目を1バイトにしてください。(0バイトだと読み飛ばされるのでダメ、ひらがななどは複数バイトなのでダメ)
もしくは、moziの要素数を大きくしてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#5

投稿記事 by みけCAT » 11年前

ファイルが開けていない場合にもfcloseしているのも気になりました。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

HI魔神
記事: 30
登録日時: 12年前
住所: 福井(大都会)

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

#6

投稿記事 by HI魔神 » 11年前

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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#7

投稿記事 by みけCAT » 11年前

HI魔神 さんが書きました:return -1で関数を終了するので失敗したらfclose()は実行されません。
HI魔神 さんが書きました:

コード:

	if( fp == NULL ){
		printf( "ファイルが開けません\n" );
	fclose( fp );
		return -1;
	}
まともなコンパイラならfclose()が実行されると思うのですが…?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る