1. ファイルにアクセスするには ファイルにアクセスするには 1. ファイルを開く 2. アクセスする 3. ファイルを閉じるという手順を踏まなければなりません 1.1. ファイルを読み込む まずはファイルの内容を画面に表示させるプログラムを作りましょう 開始 FILE *fp char fname

Similar documents
ファイル入出力

ファイル入出力

計算機プログラミング

Microsoft Word - Cプログラミング演習(9)

PowerPoint Presentation

Taro-ファイル処理(公開版).jtd

情報処理演習 B8クラス

演算増幅器

C言語講座 ~ファイル入出力編~

1. 関数 scanf() 関数 printf() は変数の値を画面に表示しますが それに対し関数 scanf() はキーボードで入力した値を変数に代入します この関数を活用することで対話式 ( ユーザーの操作に応じて処理を行う ) プログラムを作ることができるようになります 整数の和

gengo1-12

Microsoft PowerPoint - prog04.ppt

gengo1-12

Microsoft PowerPoint - 第3回目.ppt [互換モード]

gengo1-12

02: 変数と標準入出力

Microsoft PowerPoint - kougi2.ppt

Microsoft PowerPoint - kougi6.ppt

プログラミング基礎

PowerPoint プレゼンテーション

02: 変数と標準入出力

1. 入力した文字列を得る 1.1. 関数 scanf() を使う まずは関数 scanf() を使ったプログラムを作ってみましょう 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: #include<stdio.h> #define SIZE 128 main(

Microsoft Word - no204.docx

※ ポイント ※

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Microsoft Word - Cプログラミング演習(10)

練習&演習問題

Microsoft PowerPoint - guidance.ppt

2006年10月5日(木)実施

Microsoft PowerPoint - 14th.ppt [互換モード]

PowerPoint Presentation

Microsoft PowerPoint - kougi4.ppt

Prog1_12th

memo

プログラミング演習3 - Cプログラミング -

Microsoft Word - no15.docx

Microsoft PowerPoint - prog06.ppt

PowerPoint プレゼンテーション

ex14.dvi

Microsoft PowerPoint pptx

プログラミング基礎

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

Original : Hello World! (0x0xbfab85e0) Copy : Hello World! (0x0x804a050) fgets mstrcpy malloc mstrcpy (main ) mstrcpy malloc free fgets stream 1 ( \n

スライド タイトルなし

Prog1_15th

slide4.pptx

プログラミング演習3 - Cプログラミング -

Microsoft PowerPoint - CproNt11.ppt [互換モード]

PowerPoint プレゼンテーション

Microsoft Word - Cプログラミング演習(12)

プログラミング実習I

PowerPoint プレゼンテーション

Microsoft Word - cpro_m_13.doc

Cプログラミング1(再) 第2回

1. if~ 1.1. 確認を促す まずは簡単な分岐プログラムを作ってみましょう 以下はそのフローチャートです 開始 charc よろしいですか? (y/n) 変数 c の値が 'y' と等しいかどうか c c='y' Yes よろしいですね No 終了 1: 2: 3: 4: 5: 6: 7: 8

ポインタ変数

PowerPoint Presentation

PowerPoint プレゼンテーション

Microsoft Word - 06

PowerPoint Presentation

ゲームエンジンの構成要素

memo

memo

プログラミング演習 土曜日(Q組)

Microsoft Word - Cプログラミング演習(8)

V

データ構造

プログラミング基礎

Microsoft Word - no02.doc

Microsoft Word - Training10_プリプロセッサ.docx

講習No.12

Taro-ポインタ変数Ⅰ(公開版).j

C 言語講座 Vol 年 6 月 26 日 CISC

Prog1_10th

mstrcpy char *mstrcpy(const char *src); mstrcpy malloc (main free ) stdio.h fgets char *fgets(char *s, int size, FILE *stream); s size ( )

Microsoft PowerPoint - 計算機言語 第7回.ppt

PowerPoint プレゼンテーション

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

文字列 2 前回の授業ではコンピュータ内部での文字の取り扱い 文字型の変数 文字型変数への代入方法などを学習した 今回は 前回に引き続き 文字処理を学習する 内容は 標準入出力 ( キーボード ディスプレイ ) での文字処理 文字のファイル処理 文字を取り扱うライブラリ関数である 標準入出力 Lin

PowerPoint プレゼンテーション

< 目次 > 1. 練習ファイルのダウンロード 表計算ソフト Excel の基本 Excel でできること Excel の画面 セル 行 列の選択 セルにデータを入力する ( 半角英数字の場合 )

訋箊æ©�ã…Šã…�ㇰㅩã…�ㅳㇰ - 第13åłž ã…Łã‡¡ã‡¤ã…«å⁄¦ç’ƒ

Microsoft PowerPoint - 10Com2.ppt

memo

PowerPoint プレゼンテーション

今までの復習 プログラムで最低限必要なもの 入力 ( キーボードから ファイルから ) 出力 ( 画面へ ファイルへ ) 条件分岐 : 条件の成立 不成立により 異なる動作をする 繰り返し : 一定の回数の繰返し 条件成立の間の繰返し 関数の定義 関数の呼び出し C ではそれ以外に ポインタ データ

Microsoft Word - no11.docx

Prog1_2nd

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

ポインタ変数

memo

Microsoft PowerPoint - comprog08.ppt [互換モード]

データ構造

Microsoft Word - no202.docx

スライド 1

Microsoft PowerPoint - kougi8.ppt

C言語入門

untitled

Microsoft PowerPoint - kougi11.ppt

<4D F736F F D208AC888D B836A F C91808DEC837D836A B81698AC7979D8ED A E646F6

Transcription:

ファイル入出力 三池克明 ファイルのデータを読込む あるいは書込む方法と CSV 形式のファイル処理 について解説します 目次 1. ファイルにアクセスするには... 1 1.1. ファイルを読み込む...1 1.2. ソースコードを簡潔にする...9 1.3. ファイルに書き込む...11 2. CSV ファイルにアクセスする... 14 2.1. CSV ファイルを作成する...14 2.2. CSV ファイルを読み 画面に表示する...16 2.3. 国語と数学の点数を抜き出す...18 2.4. 国語と数学の平均点を算出し表示する...20 2.5. CSV 形式に整形する...21 2.6. syukei.csv に出力する...22 2.7. 連番や見出しをつける...25 3. 演習問題... 29

1. ファイルにアクセスするには ファイルにアクセスするには 1. ファイルを開く 2. アクセスする 3. ファイルを閉じるという手順を踏まなければなりません 1.1. ファイルを読み込む まずはファイルの内容を画面に表示させるプログラムを作りましょう 開始 FILE *fp char fname[],buf[],*p ファイル名 : fname fname を開きその情報を fp に代入 ファイルを開けた そのファイルの場所 ファイルを開けなかった NULL fp = NULL No Yes [fname] のオープンに失敗しました 強制終了 1-1-

1 fp が指すファイルから 1 行読み, その結果を p に 読んだ 1 行を buf に書き込む ファイルの終端を読んだら NULL が書き込まれる p NULL No buf Yes fp が指すファイルから 1 行読み, その結果を p に 読んだ 1 行を buf に書き込む fp が指すファイルを閉じる 終了 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: #include <stdio.h> #include <stdlib.h> #define NAMESIZE 256 #define LINESIZE 1024 main() { FILE char *fp; fname[namesize], buf[linesize], *p; fileread1.cpp -2-

12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: printf(" ファイル名 : "); gets(fname); /* ファイルを開く */ fp = fopen(fname, "r"); if(fp == NULL){ printf("%s のオープンに失敗しました n", fname); exit(1); /* 一行ずつ読む */ p = fgets(buf, LINESIZE, fp); while(p!= NULL){ printf("%s", buf); p = fgets(buf, LINESIZE, fp); /* ファイルを閉じる */ fclose(fp); ファイル名 : hello.cpp /* Hello World! を表示する */ 実行例 1 #include <stdio.h> main() { printf("hello World! n"); そのファイルが存在すればこのように画面に表示されます ただし きちんと表示されるのはテキスト形式のファイルのみです -3-

ファイル名 : hoge hoge のオープンに失敗しました 実行例 2 一方 存在しないファイル名を入力するとエラーメッセージが表示されます それではソースプログラムをたどってみましょう 9: 10: FILE char *fp; fname[namesize], buf[linesize], *p; 9 行目の FILE *fp; は FILE 型のポインタ fp を宣言しているようですね 厳密には違いますが ( 詳細は次章にて解説します ) 考え方としてはあながち間違いではありません これはファイルポインタと呼ばれるものでファイルの入出力処理に必要です また名前のとおり変数はポインタとしなければなりません 12: 13: printf(" ファイル名 : "); gets(fname); ここはメッセージを表示して入力を受け付けています 15: 16: /* ファイルを開く */ fp = fopen(fname, "r"); ここでは関数 fopen() を使ってファイルをオープンします -4-

また関数 fopen() の概要は以下のとおりです プロトタイプ FILE *fopen(char *filename, char *mode) char *filename ファイル名 モード 主なモードは以下の通り 引数 "r" 読込み char *mode "w" 書込み "a" 追記 "r+" 読込みと書込み 返値 FILE * オープンしたファイルのファイルポインタ オープンに失敗した場合は NULL を返す ヘッダファイル stdio.h 解説 ファイルを指定されたモードでオープンし その結果をファイルポインタとし て返す ただし ファイルが存在しない場合は NULL を返す 例 fp = fopen("file.dat", "r"); faile.dat を読込みモードでオープンし そのファイルポインタを fp に代 入します よって 15: 16: /* ファイルを開く */ fp = fopen(fname, "r"); の場合は読み取りモードでオープンしています それでは続きをたどってみましょう -5-

17: 18: 19: 20: if(fp == NULL){ printf("%s のオープンに失敗しました n", fname); exit(1); 17 行目の if 文はファイルのオープンに失敗したら ( ファイルポインタ fp の内 容が NULL だったら ) メッセージを表示して関数 exit() でプログラムを強制終了さ せます 22: 23: /* 一行ずつ読む */ buf = fgets(buf, LINESIZE, fp); ここでは関数 fgets() を使って fp が指すファイルから一行だけ読込み その内 容を文字列 buf に書き込んでいます -6-

なお 関数 fgets() の概要は以下のとおりです プロトタイプ char *fgets(char *str, int size, FILE *fp) char *str ファイルから一行だけ読み込んだ文字列 引数 int size 一行として読み込む最大の大きさ これより長い文字列はその部分が切り捨てられる FILE *fp ファイルポインタ 返値 char * 読み込めた場合は str を返す ただしファイルの終端を読んだ場合は NULLL を返す ヘッダファイル stdio.h 解説 ファイルポインタが指すファイルから一行 ( ただし [size-1] 文字まで ) を読み str に書き込む またファイルの終端を読んだ場合は NULL を返す 例 p = fgets(s, 128, fp); fp が指すファイルから一行 ( ただし 127 文字まで ) を読み その結果を p に 読み込んだ文字列を s に代入します gets() がキーボードから読むのに対し この関数 fgets() はファイルから読むと 考えれば理解しやすいでしょう gets() fgets() キーボードから入力 ファイルから入力 24: 25: 26: 27: while(buf!= NULL){ printf("%s", buf); buf = fgets(buf, LINESIZE, fp); -7-

24 行目では fgets() で読んだ文字列が NULL でない間 ( ファイルの終端まで読んでない間 )25~26 行目の処理を繰り返します こうすることでファイルの最後まで一行ずつ読み それを画面に表示することができます 29: 30: /* ファイルを閉じる */ fclose(fp); ここでは開いたファイルを閉じます 開いたファイルは必ず閉じなければならないので気をつけましょう また関数 fclose() の概要は以下のとおりです プロトタイプ int fclose(file *fp) 引数 FILE *fp ファイルポインタ 返値 int クローズに成功した場合は 0 失敗した場合は EOF を返す ヘッダファイル stdio.h 解説 ファイルポインタが指すファイルをクローズします 例 fclose(fp); fp が指すファイルをクローズします ( 通例ではこのように返値を確認しません ) 関数 fclose() の引数はファイル名ではありませんので注意しましょう -8-

1.2. より簡潔にする fileread1.cpp のフローチャートとソースコードを簡潔にしてみました 開始 FILE *fp char fname[],buf[] ファイル名 : fname fp = fopen(fname, "r") NULL = NULL [fname] のオープンに失敗しました 強制終了 fgets(buf, LINESIZE, fp) =NULL NULL buf fp が指すファイルを閉じる 終了 -9-

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: #include <stdio.h> #include <stdlib.h> #define NAMESIZE 256 #define LINESIZE 1024 main() { FILE char *fp; fname[namesize], buf[linesize]; printf(" ファイル名 : "); gets(fname); /* ファイルを開く */ if((fp = fopen(fname, "r")) == NULL){ printf("%s のオープンに失敗しました n", fname); exit(1); /* 一行ずつ読む */ while((fgets(buf, LINESIZE, fp))!= NULL){ printf("%s", buf); /* ファイルを閉じる */ fclose(fp); fileread2.cpp このように if や while 文の条件式に関数を記入することが可能です -10-

1.3. ファイルに書き込む 続いて ファイルに出力するプログラムを作りましょう 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: #include <stdio.h> #include <stdlib.h> #define SIZE 128 double doubleinput(char *); main() { FILE *fp; char fname[size], buf; double a, b; printf(" ファイル名 : "); gets(fname); a = doubleinput("a = "); b = doubleinput("b = "); if((fp = fopen(fname, "w")) == NULL){ printf("%s のオープンに失敗しました n", fname); exit(1); fprintf(fp, "a + b = %g n", a + b); fprintf(fp, "a - b = %g n", a - b); fprintf(fp, "a * b = %g n", a * b); fprintf(fp, "a / b = %g n", a / b); fclose(fp); double doubleinput(char *msg) { double val; file2.cpp -11-

37: 38: 39: 40: 41: printf(msg); scanf("%lf", &val); return val; ファイル名 : test.txt a = 6 b = 4 実行例 実行後 指定したファイル名 ( 上記の例では test.txt ) が作成されます それをメモ帳などで開いてみましょう ファイルに書き込まれているのがわかります それでは重要な部分の解説をしましょう 20: 21: 22: 23: if((fp = fopen(fname, "w")) == NULL){ printf("%s のオープンに失敗しました n", fname); exit(1); 今回はファイルへの書込みを行うのでモードを "w" としています -12-

25: 26: 27: 28: fprintf(fp, "a + b = %g n", a + b); fprintf(fp, "a - b = %g n", a - b); fprintf(fp, "a * b = %g n", a * b); fprintf(fp, "a / b = %g n", a / b); なんとなく関数 printf() や関数 sprintf に似ていますね この関数 fprintf() は画面や文字配列ではなくファイルに出力します printf() sprintf() fprintf() 画面に出力 文字列に出力 ファイルに出力 関数 fprintf() の概要は以下のとおりです プロトタイプ int fprintf(file *fp, char *format,...) FILE *fp ファイルポインタ 引数 char *format 表示する文字列 %d など変換仕様の記述が可能... format に記述された変換仕様に対応する式 返値 int 出力する半角文字数を返すただしエラーが発生すると EOF を返す ヘッダファイル stdio.h 解説 format に記述された内容に従って文字列を fp が指すファイルに出力する 例 fprintf(fp, "a = %d n", a); 生成した文字列を fp が指すファイルに書き込みます ( 通例ではこのように返値を確認しません ) -13-

2. CSV ファイルにアクセスする CSV ファイルとはカンマで区切られたデータファイルのことです この形式のファイルは Microsoft Excel など表計算ソフトで開くことができ ますので自作した C プログラムと表計算ソフトを連携させることも可能です 本書では Microsoft Excel を例に解説しています 他の表計算ソフトを使用す る場合は用語を適宜読み替えて下さい 2.1. CSV ファイルを作成する 以下の CSV ファイルの集計プログラムを作ってみましょう 一行が生徒一人の国語と数学の点数 表は点数のみで 見出しは無い 生徒の人数は不定とする Microsoft Excel を起動し左図のような 表を作成します -14-

メニュー ファイル (F) - 名前をつけて保存 (A)... をクリックします 名前をつけて保存 ダイアログボックスが表示されるので 保存先(I) ソースファイルが保存されているフォルダ ファイル名(N) score ファイルの種類(T) CSV( カンマ区切り )(*.CSV) として 保存 (S) ボタンをクリックします 1C 言語のソースファイルが 保存されているフォルダを選択 2 score と入力 3 CSV (*.csv) を選択 4 クリック 保存するときいくつかの警告メッセージが表示されることがあります これは特に問題はありませんので保存を実行させてください -15-

2.2. CSV ファイルを読み 画面に表示する まずは CSV ファイルを読込むプログラムを作ってみましょう 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: #include <stdio.h> #include <stdlib.h> #define LINESIZE 128 main() { FILE char *in; str[linesize]; if((in = fopen("score.csv", "r")) == NULL){ printf("score.csv のオープンに失敗しました n"); exit(1); while(fgets(str, LINESIZE, in)!= NULL){ printf("%s n", str); fclose(in); syukei1.cpp -16-

100,80 60,50 70,80 90,60 80,80 50,70 90,100 80,90 70,90 60,70 実行例 このように CSV ファイルの内容がそのまま表示されます -17-

2.3. 国語と数学の点数を抜き出す とりあえず読込みには成功したので 今度は関数 sscanf() を使って数値を抜き 出し個別に表示してみましょう 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: #include <stdio.h> #include <stdlib.h> #define LINESIZE 128 main() { FILE char int *in; str[linesize]; kokugo, sugaku; if((in = fopen("score.csv", "r")) == NULL){ printf("score.csv のオープンに失敗しました n"); exit(1); while(fgets(str, LINESIZE, in)!= NULL){ sscanf(str, "%d,%d", &kokugo, &sugaku); printf(" 国語 :%3d, 数学 :%3d n", kokugo, sugaku); fclose(in); syukei2.cpp -18-

国語 :100, 数学 : 80 国語 : 60, 数学 : 50 国語 : 70, 数学 : 80 国語 : 90, 数学 : 60 国語 : 80, 数学 : 80 国語 : 50, 数学 : 70 国語 : 90, 数学 :100 国語 : 80, 数学 : 90 国語 : 70, 数学 : 90 国語 : 60, 数学 : 70 実行例 どうやらうまく取り出せたようです -19-

2.4. 国語と数学の平均点を算出し表示する 続いて 取り出した点数から平均点を算出しましょう 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: #include <stdio.h> #include <stdlib.h> #define LINESIZE 128 main() { FILE *in; char str[linesize]; int kokugo, sugaku; double heikin; if((in = fopen("score.csv", "r")) == NULL){ printf("score.csv のオープンに失敗しました n"); exit(1); syukei3.cpp while(fgets(str, LINESIZE, in)!= NULL){ sscanf(str, "%d,%d", &kokugo, &sugaku); heikin = (kokugo + sugaku) / 2.0; printf(" 国語 :%3d, 数学 :%3d, 平均 :%5.1f n", kokugo, sugaku, heikin); fclose(in); 国語 :100, 数学 : 80, 平均 : 90.0 国語 : 60, 数学 : 50, 平均 : 55.0 国語 : 70, 数学 : 80, 平均 : 75.0 国語 : 90, 数学 : 60, 平均 : 75.0 国語 : 80, 数学 : 80, 平均 : 80.0 ( 以下省略 ) 実行例 -20-

2.5. CSV 形式に整形する 今度は国語 数学 平均点を CSV 形式に整形しましょう ファイルへの書込みまであと一歩です 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: #include <stdio.h> #include <stdlib.h> #define LINESIZE 128 main() { FILE *in; char str[linesize]; int kokugo, sugaku; double heikin; if((in = fopen("score.csv", "r")) == NULL){ printf("score.csv のオープンに失敗しました n"); exit(1); while(fgets(str, LINESIZE, in)!= NULL){ sscanf(str, "%d,%d", &kokugo, &sugaku); heikin = (kokugo + sugaku) / 2.0; printf("%d,%d,%g n", kokugo, sugaku, heikin); fclose(in); syukei4.cpp 100,80,90 60,50,55 70,80,75 90,60,75 80,80,80 ( 以下省略 ) 実行例 -21-

2.6. syukei.csv に出力する いよいよファイルに書込みます そのフローチャートとソースコードは以下の通りです 開始 FILE *in, out char str[] int kokugo, sugaku double heikin in = fopen("score.csv", "r") NULL out=fopen("syukei.csv", "w") NULL = NULL score.csv のオープンに失敗しました強制終了 = NULL syukei.csv のオープンに失敗しました in が指すファイルを閉じる 強制終了 fgets(buf, LINESIZE, in) =NULL NULL sscanf(str, "%d,%d", &kokugo, &sugaku) heikin (kokugo + sugaku) / 2.0 fprintf(out,"%d,%d,%g n",kokugo,sugaku,heikin) in out がそれぞれ指すファイルを閉じる 終了 -22-

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: #include <stdio.h> #include <stdlib.h> #define LINESIZE 128 main() { FILE *in, *out; char str[linesize]; int kokugo, sugaku; double heikin; if((in = fopen("score.csv", "r")) == NULL){ printf("score.csv のオープンに失敗しました n"); exit(1); if((out = fopen("syukei.csv", "w")) == NULL){ printf("syukei.csv のオープンに失敗しました n"); fclose(in); exit(1); syukei5.cpp while(fgets(str, LINESIZE, in)!= NULL){ sscanf(str, "%d,%d", &kokugo, &sugaku); heikin = (kokugo + sugaku) / 2.0; fprintf(out, "%d,%d,%g n", kokugo, sugaku, heikin); fclose(in); fclose(out); 当然ですが 実行しても画面には何も表示されません -23-

Microsoft Excel を起動しメニュー ファイル (F) - 開く (O) をク リックします このとき ファイルを開く ダイアログボックスが表示されるので ファイルの種類(T) テキストファイル ファイルの場所(I) ソースファイルが保存されているフォルダ ファイル名(N) syukei として 開く (O) ボタンをクリックします 2C 言語のソースファイルが 保存されているフォルダを選択 3 syukei をクリック 1 テキストファイル を選択 4 クリック 集計された成績ファイルを読むこと ができるようになりました -24-

2.7. 連番や見出しをつける syukei.csv を出力する際に 生徒番号を振ります なお 生徒番号は 1 からの連番とします 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: #include <stdio.h> #include <stdlib.h> #define LINESIZE 128 main() { FILE *in, *out; char str[linesize]; int kokugo, sugaku; double heikin; int n; if((in = fopen("score.csv", "r")) == NULL){ printf("score.csv のオープンに失敗しました n"); exit(1); if((out = fopen("syukei.csv", "w")) == NULL){ printf("syukei.csv のオープンに失敗しました n"); fclose(in); exit(1); syukei6.cpp for(n = 1; fgets(str, LINESIZE, in)!= NULL; n++){ sscanf(str, "%d,%d", &kokugo, &sugaku); heikin = (kokugo + sugaku) / 2.0; fprintf(out, "%d,%d,%d,%g n", n, kokugo, sugaku, heikin); fclose(in); fclose(out); -25-

た 一列目 (A 列 ) に連番が振られまし 数字だけの表ではわかりにくいので 一行目に見出しをつけるようにしましょう 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: #include <stdio.h> #include <stdlib.h> #define LINESIZE 128 main() { FILE *in, *out; char str[linesize]; int kokugo, sugaku; double heikin; int n; if((in = fopen("score.csv", "r")) == NULL){ printf("score.csv のオープンに失敗しました n"); exit(1); if((out = fopen("syukei.csv", "w")) == NULL){ printf("syukei.csv のオープンに失敗しました n"); fclose(in); syukei7.cpp -26-

21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: exit(1); fprintf(out," 番号, 国語, 数学, 平均 n"); for(n = 1; fgets(str, LINESIZE, in)!= NULL; n++){ sscanf(str, "%d,%d", &kokugo, &sugaku); heikin = (kokugo + sugaku) / 2.0; fprintf(out, "%d,%d,%d,%g n", n, kokugo, sugaku, heikin); fclose(in); fclose(out); 1 行目に見出しが入りました これで幾分か見やすい集計表になり ましたね -27-

なお syukei7 のフローチャートは以下の通りです 参考にしてください 開始 FILE *in, out int kokugo, sugaku int n char str[] double heikin in = fopen("score.csv", "r") NULL out=fopen("syukei.csv", "w") NULL = NULL score.csv のオープンに失敗しました強制終了 = NULL syukei.csv のオープンに失敗しました in が指すファイルを閉じる 強制終了 fprintf(out," 番号, 国語, 数学, 平均 n") n 1 fgets(buf, LINESIZE, fp) =NULL NULL sscanf(str, "%d,%d", &kokugo, &sugaku) heikin (kokugo + sugaku) / 2.0 fprintf(out, "%d,%d,%d,%g n", n, kokugo, sugaku, heikin) n n+1 in out がそれぞれ指すファイルを閉じる 終了 -28-

3. 演習問題 14-1. syukei7.cpp を改造して以下のような CSV ファイルを出力するプログラ ム ensyu14-1.cpp を作りなさい 14-2. ensyu14-1.cpp を参考に以下のような CSV ファイルを出力するプログラ ム ensyu14-2.cpp を作りなさい -29-