fscanfの後のファイルポインタt@

[戻る]
たい 2006/10/31(火) 02:07:41
はじめまして、よろしくお願い致します。
VisualC++ 2005 ExpressEditionを使用しています。

---------------------------------------
1:data.datにデータの個数とデータを保存

2:fscanfでデータの個数を読み込み

3:必要なデータの個数分、メモリを確保

4:fscanfでデータを読み込む

----------------------------------------

という流れを作りたいと思っています。そこで、

-----------------------------------------

FILE* fp;
fp = fopen("data.dat", "r");

if( !fp )
{ // 読み込めない場合の処理 }

// 読み込めた場合

char  Data_Num; // データの個数
char* HData;   // データ受け取り用

// データ個数受け取り
fscanf( fp, "%d", &Data_Num );

// データの個数分、メモリ確保
HData = ( char* )malloc( sizeof( char ) * Data_Num );

// データの個数分、データを受け取る
for( i = 0; i < Data_Num; i++ )
{ fscanf( fp, "%d", &HData[ i ] ); }

// ファイルクローズ
fclose( fp );

------------------------------------------------

で実行したところ、強制終了になってしまいました。
データを受け取るところで強制終了になります。

分かった原因は、データ個数を受け取る前までfpはファイルを指しているのですが、受け
取った後、fpがNULLになっています。

fcloseの前にfpがNULLになってしまう原因が

たい 2006/10/31(火) 02:10:46
ごめんなさい、途中で送信してしまいました。

fcloseの前にfpがNULLになってしまう原因が分からないのですが、間違っている部分のご
指摘、よろしくお願い致します。

YuO [E-Mail] 2006/10/31(火) 02:22:55
%dで読み込んでいるため,範囲外アクセスが起きています。
%dはint型へのポインタを要求しますから,根本的に未定義動作だったりしますが。

というわけで,一回int型引数に読み込んだ後,HDataに設定するようにしましょう。

たい 2006/10/31(火) 02:43:35
YuO様、早速のご指摘有難うございます。

>>%dで読み込んでいるため,範囲外アクセスが起きています。

指摘されてはじめて気が付きました…。
Data_Num, HDataをint型に直したところ、解決しました。

こういった雑な部分からエラーが起こるのですね。
これから気をつけたいです。

本当に有難うございました。

たい 2006/10/31(火) 02:51:27
[[解決]]
すみません、解決しました。

[原因]
int型(%d)でファイルを読み込んでいるのに、受け取る型をint以外(char)にした
そのため範囲外アクセスが起き、fscanfの後にfpがNULLになってしまった

[解決法]
int型で受け取る

古いスレッドには追加発言できません。