第14章 ファイル操作(コマンドプロンプト版)

第14章 ファイル操作
(コマンドプロンプト版)





CSVファイルへの出力
CSVファイルからの入力
CSVファイルへの追加出力
練習問題
Excel による関数グラフ描画
今日のポイント
リダイレクトとCSVファイルをうまく使おう
1
CSVファイルとは

コンマ区切り(Comma Separated Values)形式
のテキストファイル

データをコンマ(,)で区切り、改行を用いて2次元
的に配列

コンマを含むデータは二重引用符(")でくくられる
標準出力例
printf("%f, %f, %f\n", a, b, sum);
標準入力例
scanf("%lf, %lf, %lf", &a, &b, &sum);
2
例14.1.1 CSVファイルへの出力
/* ex14_1_1.c */
notepad で新規作成
#include <stdio.h>
devenv で編集
int main(void)
{
double a, b, sum;
a = 2.345;
コンマがなければ
b = 5.678;
CSVじゃない
sum = a + b;
printf("%f, %f, %f\n", a, b, sum);
return 0;
}
Z:\nyumon2>cl ex14_1_1.c
Z:\nyumon2>ex14_1_1 > foo.csv
3
ソースファイルの新規作成と編集

notepad (メモ帳)
新規作成のとき
Z:\nyumon2>notepad ex14_1_1.c
保存先が Z:\nyumon2 であることを確認

copy (内部コマンド)
コピーするとき
Z:\nyumon2>copy ex14_1_1.c ex14_2_1.c
以前作った14章のファイルを exploler でコピーしてもよい

devenv (開発環境)
編集するとき
Z:\nyumon2>e14_1_1.c
4
例14.2.1 CSVファイルからの入力
/* ex14_2_1.c */
copy でコピー
#include <stdio.h>
devenv で編集
int main(void)
{
コンマを取ったら?
double a, b, sum;
scanf("%lf, %lf, %lf", &a, &b, &sum);
printf("a=%f, b=%f, sum=%f\n", a, b, sum);
return 0;
}
Z:\nyumon2>copy ex14_1_1.c ex14_2_1.c
Z:\nyumon2>ex14_2_1.c
Z:\nyumon2>cl ex14_2_1.c
Z:\nyumon2>ex14_2_1 < foo.csv
5
例14.2.2 CSVファイルからの入力
/* ex14_2_2.c */
#include <stdio.h>
int main(void)
{
double a, b, sum; char s[135];
fgets(s, 128, stdin);
sscanf(s, "%lf, %lf, %lf", &a,
printf("a=%f, b=%f, sum=%f\n",
return 0;
}
copy でコピー
devenv で編集
コンマを
取ったら?
&b, &sum);
a, b, sum);
fgets: 一行入力、sscanf: 文字列sからscanf
Z:\nyumon2>cl ex14_2_2.c
Z:\nyumon2>ex14_2_2 < foo.csv
6
例14.3.1 CSVファイルへの追加出力
/* ex14_3_1.c */
copy でコピー
#include <stdio.h>
devenv で編集
int main(void)
{
double a, b, sum;
a = 1.234; b = 2.567;
sum = a + b;
printf("%f, %f, %f\n", a, b, sum);
return 0;
}
Z:\nyumon2>cl ex14_3_1.c
Z:\nyumon2>ex14_3_1 >> foo.csv
7
例14.4.3, 例14.5.1のための準備

boo.csvファイルの作成
Z:\nyumon2>notepad boo.csv
1.000000, 2.000000
3.000000, 4.000000
5.000000, 6.000000
以前の第14章14.4の学習時に例14.4.3で用いた foo.txt が
作ってある人は、そこからコピーすればよい
8
例14.4.3 標準ファイル入出力
/* ex14_4_3.c stdin version */
#include <stdio.h>
int main(void)
読んですぐ使い捨てるので配列は不要
{
double x, y;
fgets関数の値が NULL でない(入力
int i = 0;
が Ctrl-z でない)間は{}を繰り返す
char s[135];
while (fgets(s, 128, stdin) != NULL) {
sscanf(s, "%lf, %lf", &x, &y);
printf("%f, %f\n", x, y);
i++;
}
printf("ファイル中のデータ (x, y) の数は %d 組です.\n", i);
return 0;
}
Z:\nyumon2>cl ex14_4_3.c
Z:\nyumon2>ex14_4_3 < boo.csv
9
例14.5.1 標準ファイル入出力
/* ex14_5_1.c stdin version */
#include <stdio.h>
int main(void)
{
double a, b, sum;
char s[135];
while (fgets(s, 128, stdin) != NULL) {
sscanf(s, "%lf, %lf", &a, &b);
sum = a + b;
printf("%f, %f, %f\n", a, b, sum);
}
return 0;
}
Z:\nyumon2>cl ex14_5_1.c
Z:\nyumon2>ex14_5_1 < foo.csv > bar.csv
10
教科書p.139
問題14.1 関数値を出力するプログラム
/* q14_1_1.c */
#include <stdio.h>
int main(void)
{
int i; double x, y;
for (i = -10; i <= 10; i++) {
x = i;
y = 2*x*x + 3;
printf("%f, %f\n", x, y);
}
return 0;
}
Z:\nyumon2>cl q14_1_1.c
Z:\nyumon2>q14_1_1 > data1.csv
11
データの項目名も出力する場合
/* q14_1_2.c */
#include <stdio.h>
int main(void)
{
int i; double x, y;
この行を追加
printf("x, y\n");
for (i = -10; i <= 10; i++) {
x = i;
y = 2*x*x + 3;
printf("%f, %f\n", x, y);
}
return 0;
}
12
Excel による関数グラフ描画
1.
2.
3.
4.
5.
CSVファイルをダブルクリックして、Excelを起動
Microsoft Excelブック(*.xls)形式で保存
忘れない
うちに保存
プロットしたいデータのセル範囲を選択
「グラフウィザード」をクリック
「散布図」を選択し、「形式(T)」で好みの折れ線グラフを
選択
6. 「次へ>」を2回クリックし、「タイトルとラベル」タブを表示
7. 「X/数値軸(A)」に x、「Y/数値軸(V)」に y を記入
8. 「完了」をクリック
最後に上書き保存
13
Excel におけるグラフの修正

必ずグラフエリアを選択した状態で行う

「グラフ(C)」メニューの「グラフオプション(C)...」に
よる変更


「グラフ(C)」メニューの「元のデータ(S)...」による
変更


「目盛線」タブでY軸の目盛線の削除、など
「系列」タブで各系列に名前を設定、など
右クリックでの「~書式設定(O)…」による変更

「軸の書式設定(O)...」の「目盛」タブで範囲の変更、など
14
修正前と修正後
250
200
y
150
y
系列 1
250
100
y = 2 x^2 + 3
50
200
0
-20
-10
0
10
150
20
x
100
50
0
-10
-5
x
0
5
10
15
Excel で対数グラフを描く
1. 0より大きいデータ領域のみを選択
2. 「グラフウィザード」により「散布図」の折れ線
グラフを描く
3. X軸またはY軸の数値軸(目盛)を右クリック
4. 「軸の書式設定(O)...」をクリック
5. 「目盛」タブを選択
6. 下方の「対数目盛を表示する(L)」をチェック
7. 「 OK 」をクリック
8. 「グラフオプション(O)…」で目盛線を描く
16
第2回レポートの類題
スキルアップタイム 1
1. 標準入力から x と y を読み込み、プログラム中
で z = x3 - 75x を計算し、x, y, z を標準出力す
るプログラム q14_s.c を作成せよ
2. data1.csv から入力し、結果を data2.csv に書き
込め
3. 例14.5.1のプログラムを参考にするとよい
17
スキルアップタイム 2
1.
2.
3.
4.
5.
6.
7.
8.
data2.csv をExcelで読み込み、data2.xls に保存
Xラベルを x、Yラベルを y, z としてグラフを描画
X軸の範囲を -10 ~ 10、 Y軸の範囲を -300 ~ 300 に
変更
Y軸の目盛線を削除
凡例の系列1に y = 2x^2 + 3、系列2に z = x^3 - 75x
と記入
凡例をプロットエリア内の空いている領域に移動
プロットエリアのサイズを調整
プロットエリアの背景色をなくす
18
第3回レポート(必須)
課題: スキルアップタイム 1 および 2



提出期限: 2010年1月8日(金) 12:50
提出場所: ネットワーク実験室(1)入口の提出箱
以下の項目を入れること(表紙は不要)
1.
学籍番号、氏 名
2.
3.
"q14_s.c" のソースリスト
実行結果(data2.csv)とそのグラフ
4.
感想
第2回レポートの類題
19
前回のスキルアップタイムの解答例
~コマンド行引数を用いた自作コマンドの作成~

コマンド行で指定した文字の数をカウントする chc.c
を完成させよう
/* chc.c: char counter */
#include <stdio.h>
int main(int argc, char *argv[])
{
int c, cnt=0;
while ((c=fgetc(stdin)) != EOF) {
if (c == *argv[1]) cnt++;
}
printf("%c: %d\n", *argv[1], cnt);
return 0;
}
20
前回のスキルアップタイム
(オプション)の解答例
/* excel exec program */
excel3.c
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char cmd[128]="\"C:\\Program Files\\"
"Microsoft Office\\Office11\\Excel.exe\" ";
if (argc > 1) strcat(cmd, argv[1]);
system(cmd);
return 0;
}
Z:\nyumon2>cl excel3.c
Z:\nyumon2>excel3 foo.csv
21