2000年11月15日 作成(7-3 ファイル入出力)
  関谷トップページへ アプリケーション演習、Cプログラミングトップページへ 作者へのメッセージ

アプリケーション演習・C言語プログラミング No.17 7-3 ファイル入出力

  2000.11.15 KPC 情報技術科 関谷

1.前回の復習(「7-1,2  ファイルの入力、出力」)

A。コマンドライン引数の使用

 コマンドライン引数は、プログラム7-1で説明があるほか、8-3 コマンド行で再度、解説がある。「MS-DOSプロンプト」の窓で、コマンド行で、プログラム名を指定して実行する際に、引数を指定するやり方である。C言語では、main()関数への2つの引数として実現している。引数の個数argcと文字列へのポインタ配列argvである。  コマンドライン引数の使用プログラムは、例を見ると分かるが、引数の個数argcを調べて、文字列へのポインタ配列argvを参照している。(添え字の0がプログラム名なので、入出力対象のファイル名は、*++argvとなるなど)

詳しい情報の調べ方の例-MSDNライブラリから

MSDNの使い方:
1)起動:スタート-プログラムMicrosoft Developer Network-MSDNライブラリをクリックする。 2)検索の方法:左の窓の「アクティブ サブセット」を「*Visual C++ドキュメント」にする。
 検索かキーワードのタブで、語句を入力する。例えば、「コマンドライン引数」など調べたい語句です。 「検索開始」ボタンのクリックで、トピックの「トピック選択」に一覧表の候補が出てくる。
 この例では、「引数の定義」を選択して、「表示」ボタンをクリックする。
 右の窓にその解説が表示されるので、その内容を見る。
 (ここで、さらに必要なら、左のトピックの選択を変えて、表示する。)

以下は、表示されたものを貼り付けたものです
引数の定義
以下のプロトタイプの引数を使うと、簡単にコマンドライン引数を解析できます。必要に応じて、環境変数にアクセスすることもできます。

int main( int argc[ , char *argv[ ] [, char *envp[ ] ] ] );

または

int wmain( int argc[ , wchar_t *argv[ ] [, wchar_t *envp[ ] ] ] );

引数の定義は次のとおりです。

argc

  argv に格納されている引数の数を表す整数です。argc はプログラム名も引数として渡されるので、必ず 1 以上の値になります。

argv

  NULL で終わる文字列の配列で、プログラムのユーザーが入力したコマンドライン引数を表します。規約では、argv[0] でプログラムを起動したコマンド名を表し、argv[1] で最初のコマンドライン引数を表します。以降は argv[argc] (必ず NULL) まで同様です。コマンドライン処理を行わない方法については、「C++ コマンドライン処理のカスタマイズ」を参照してください。

最初のコマンドライン引数は必ず argv[1] に保持され、最後のコマンドライン引数は argv[argc - 1] に保持されます。
(以下は省略)

B.ファイル構造体FILEとファイルのオープンfopen()とクローズfclose()関数

 ライブラリ関数で準備されているので、これらを使って、操作をすることになる。詳細は、MSDNライブラリを参照すると良い。
"FILE"で検索すると、標準型のページがあり、その中に「FILE構造体」の説明行がある。
FILE 構造体 ストリームの現在の状態に関する情報を格納する。すべてのストリーム入出力操作で使う。 STDIO.H にある。

"fopen"で検索すると、関数の説明がある。(途中で省略している)

fopen、_wfopen
ファイルを開きます。 

FILE *fopen( const char *filename, const char *mode );

FILE *_wfopen( const wchar_t *filename, const wchar_t *mode );

関数 必要なヘッダー 互換性 
fopen  ANSI, Win 95, Win NT 
_wfopen  または  Win NT 

(以下は省略するが、解説している項目として、以下の項目がある。)
ライブラリ
戻り値
引数
解説
mode 文字列には、ファイルに対して要求する以下のアクセス モードを指定します。

プログラム例

2.今日の実習(7-3 ファイル入出力、演習)

7-3 ファイル入出力

プログラム 7−3 ファイルの入出力

 プログラム7−3は、テキストファイルの入出力するプログラム例である。ファイル名は、コマンドラインの引数から、順番に入力ファイル名、出力ファイル名にしている。処理は、ファイル名を使ってファイルを開く。inpt()関数で、EOFになるまで、文字の配列s[1000]に読み込んでいる。文字の配列sの最後に文字列の終わり\0を最後に書いている。出力ファイル名で開き、outpt()関数で、文字の配列sを書き出している。ファイルの大きさが1000バイトを超えると、このプログラムは正しく動かなくなってしまう。
<実習上の注意やコメント>
1)プログラムは、C言語のプログラムの様式に合わせて作成のこと。なお、考察を先頭部分に書くのが良い。
2)ソースプログラムの入力方法:元になるプログラム7-1,7-2を貼り付けて、それを編集するのが早いし、様式も統一できる。入力の間違いも少ないであろう。
3)ソースプログラムの最初に、#include を付けること。
4)ANSI Cとしては、関数のプロトタイプ宣言をmain()関数の前に、付けること。
void inpt(FILE *fp, char *s);
void outpt(FILE *fp, char *s);

7-4 ファイル入出力(簡単化したもの)

 入力したものを単に出力するだけのプログラムで、関数に分けるのをやめたもの。
 先に、2つのファイルを開いて、読み込み後にすぐに書き出している。従って、文字の配列が不要になった。
 このプログラムも、7-3を元に、編集すれば、入力は短時間で済む。

7章の演習問題 1)−4)

演習7−1 3人の名前をデータファイルnamefl.datに作る。

 名前を文字配列で持つとして、3人の場合に、2次元の配列にするとか、構造を考えるかどうか? 次の問題の解答を見ると、そこまでは考慮していないようである。単純に、カンマなどで区切ることにして良い。

演習7−2 データファイルnamefl.datから3人の名前を印字する。

 「名前を文字配列で持つとして、3人の場合に、2次元の配列にするとか、構造を考えるかどうか?」は、作ったプログラムに依る。単純に、文字の表示のみでも良い。

演習7−3 100個の整数を乱数(3章の演習問題8)で発生させ、データファイルflint.datに記憶させなさい。

 整数を文字に変換するのには、4章のratoi(m,t)を利用する。また、整数を1行ごとに記憶する。
 テキストの問題文(上)にもあるように、この演習7ー3は、プログラムを0から作るのではない。既に作っている乱数作成プログラム(演習3ー8)を元に、整数を文字配列に変換して(この部分も利用)、テキストファイルとしての出力を追加する問題である。

演習7−4 データファイルflint.datを用いて、100個の整数データの平均値を計算しなさい。

 平均値を計算するには、合計を求めて、それをデータ個数で割る。文字配列から整数に変換するのには、4章のnatoi(st)を改造して利用すれば良い。

3.レポート

3.1 レポート用ファイルの作成

 レポートは、実習した全部のプログラムを順番に貼り付けて、レポート用のテキストファイルを作成のこと。

3.2 提出フォルダとファイル名

・フォルダ:w:\アプリケーション演習¥C言語74_fio
・ファイル名:nn氏名ap17.txt