ファイル処理の基礎

  1. 標準の Windows ファイル操作のダイアログ コントロール オブジェクトを構築する。OpenFileDialog の値により、[ファイルを開く]、[ファイル名を付けて保存] のどちらのダイアログ コントロールでも構築できる。

    ダイアログ コントロールのコントロールを初期化後、DoModal メンバ関数を呼び出してダイアログ コントロールを表示し、パスやファイルを指定できるようにする。DoModal メンバ関数は、[OK] (IDOK) ボタン、または、[キャンセル] (IDCANCEL) ボタンのどちらが選択されたかを返す。

  2. ifstream はファイルからの入力用、ofstream はファイルからの出力用に使用されるクラスだ。これらのクラスを使用するには $ <$fstream$ >$をインクルードしないといけない。

    C++ の入出力用のクラスは一番基本に ios があり、ここから入力用のクラス istream と出力用のクラス ostream が派生し、更にこの 2 つから入出力用のクラス iostream が派生している。また istream, ostream, iostream の各々からファイル用のクラス ifstream, ofstream, fstream が派生している。

  3. 文字列ストリーム(String Streams)

    文字列ストリームは、内部文字ファイルに文字列の使用を許すストリームオブジェクトである。

    文字列ストリームは入力と出力のバッファに非常に役に立つ。これらの型istringstreamとostringstreamはヘッダファイル$ <$sstream$ >$に定義されている。( 詳しくはC++言語入門12章参照)

    ファイル処理のプログラムを書く上で,よく使うものを挙げておく。

    クラス メンバ 意味
    ios eof ファイルの終わり
      fail 重大な入出力エラーか、回復可能な入出力書式エラー
    istream getline ストリームから一行取り出す
    ostream write 指定されたバイト数だけバッファからストリームに出力
    ifstream open ファイルを開く
      close ファイルを閉じる
    ofstream open ファイルを開く
      close ファイルを閉じる

  4. ファイルの操作 プログラム中での使用例から、各メンバの使用方法はほぼ明らかだと思うが、 getline だけは注意する必要がある。

    \framebox{
\begin{tabular}{l}
\hspace{1cm} fin.getline(buf, 文字数);
\end{tabular}}

    において、buf は文字列格納場所 (へのポインタ)、文字数は終端文字 NULL を含めての最大文字数である。(従って上のプログラムの場合には厳密には 79 文字しか対応できまない。) また改行文字 $ \yen$n はストリームから取り出されるが格納はされない。

    getline の正式な構文は

    \framebox{
\begin{tabular}{l}
\hspace{1cm} fin.getline(buf, 文字数, '$\yen$n');
\end{tabular}}

    であり、行の区切りとして、改行文字 $ \yen$n 以外の文字を指定することが可能である。

  5. データ点の表示

    データ点の表示には,デバイスコンテキストのEllipse(楕円)関数を用いている。Ellipse関数は四角形の左上隅の点と右下隅の点を結ぶ楕円を描く。ここでは,原点の座標を(cx,cy)としているので,データ点(xs,ys)の表示は

    (cx+xs - 2, cy-(ys-2))と(cx+xs,cy-ys)
    を通る楕円で描いている。楕円の大きさは2ピクセルである。 ただ,楕円をペンで描くと,枠しか描かないので,ここではブラシも使って中を塗りつぶしている。