fscanfの後のファイルポインタt@ – プログラミング – Home

fscanfの後のファイルポインタt@
 
通知
すべてクリア

[解決済] fscanfの後のファイルポインタt@


たい
 たい
(@たい)
ゲスト
結合: 22年前
投稿: 16
Topic starter  

はじめまして、よろしくお願い致します。
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になってしまう原因が


引用未解決
トピックタグ
たい
 たい
(@たい)
ゲスト
結合: 22年前
投稿: 16
Topic starter  

ごめんなさい、途中で送信してしまいました。

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


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

%dで読み込んでいるため,範囲外アクセスが起きています。
%dはint型へのポインタを要求しますから,根本的に未定義動作だったりしますが。

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


返信引用
たい
 たい
(@たい)
ゲスト
結合: 22年前
投稿: 16
Topic starter  

YuO様、早速のご指摘有難うございます。

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

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

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

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


返信引用
たい
 たい
(@たい)
ゲスト
結合: 22年前
投稿: 16
Topic starter  

すみません、解決しました。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました