データを読み込む 3

CFileクラスの利用

ファイルを開く

 さて,前回までの話でファイル名の取得まで終わっているので,後はファイルを開くことができればデータ読み込みはほぼ完了します。Cのコンソールアプリケーションを作っていた方ならばファイルポインタを使っていたと思います。Visual C++でも当然ファイルポインタは使用可能です。前回パス名の表示に用いたCStringというクラスのオブジェクトを用いて以下のようにファイルポインタを取得することが可能です。

	FILE*		fp;
	CString		filepath;

//filepathにファイルのフルパスを取得する

	fp = fopen( filepath, "r" );

CFileクラス

 MFCにおけるファイル入出力にはCFileクラスもしくはCStdioFileクラスのオブジェクトを使用します。基本的な使用法は以前のファイルポインタとほぼ同様です。CFileクラスとCFileStdioクラスの違いは,前者がバイナリ用で後者がテキスト読み込みを拡張したものです。CStdioFileはCFileの派生クラスなのでバイナリの読み込みもCFileと同様に可能です。それぞれの使用例を以下に示します。

	CFile		file;
	CString		filepath;
	char*		pBuf;	//読み込みバッファ
	int		nCount;	//読み込みバイト数

//filepathにファイルのフルパスを取得する
	//ファイルオープン
	file.Open( filepath, CFile::modeRead);
	//ファイル読み込み
	file.Read(pBuf,nCount);
	//ファイルクローズ
	file.Close();

	CStdioFile	stdfile;
	CString		filepath;
	CString		str;

//filepathにファイルのフルパスを取得する

	//ファイルオープン
	stdfile.Open( filepath, CFile::modeRead);
	//ファイル読み込み(最初の改行文字まで読み込む)
	stdfile.ReadString(str);
	//ファイルクローズ
	stdfile.Close();

 それではCStdioFileクラスを使ってファイルを開くサンプルを実装してみます。前回同様にOnFileRead関数に以下のコードを書き加えてください。

void CMeshDoc::OnFileRead() 
{
	// TODO: この位置にコマンド ハンドラ用のコードを追加してください
	CFileDialog filedlg(TRUE	//ファイル読み込みモード
		, "dat"					//デフォルトの拡張子
		, NULL					//デフォルトで指定するファイル名
		, OFN_HIDEREADONLY		//オプション指定のフラグ
		, "グリッドファイル(*.dat)|*.dat|すべてのファイル(*.*)|*.*||");	//ファイル名のフィルタ
	CString		path,str;
	CStdioFile	stdfile;

	if( filedlg.DoModal() == IDOK){	//ダイアログを表示し,OKボタンが押されたならば
		path = filedlg.GetPathName();
		if(stdfile.Open(path,CFile::modeRead)){	//ファイルを正常に開けた場合
			stdfile.ReadString(str);
			stdfile.Close();
			AfxMessageBox(str);
		}
		else{
			AfxMessageBox("ファイルを開くことができませんでした");
		}
	}
}

 ビルドして実行してみてください。何か適当なテキストファイルを開くと1行目の文字列が表示されると思います。プログラム中でif文の中にOpenが入っていますが,これは戻り値が正常に開いた場合はTrueを失敗した場合はFalseを返すのを利用して,ファイルをオープンできたかどうかをチェックしています。

戻る