Transcript 第13回

プログラミングⅡ
第13回
http://www.fit.ac.jp/~matsuki/lecture.html
2
連絡
• 小テスト
– 授業開始直後と終了直前に小テストを2行います
– 授業開始直後テスト(復習テスト)⇒前回の復習
– 授業終了直前テスト(本テスト)⇒その日の内容
の復習
– 本テストの成績(正答率)が50%以下の場合は、
宿題を出します(レポートとは別)。
– 宿題を決められた期日までに提出しない場合は
、欠席扱いにします
3
宿題の提出について
以下の場合は、出題日の出席を欠席とする
• 締切日を過ぎた場合
• 正解率が7割未満の場合
提出は、PDFファイルを印刷して、それに答えを
書いて提出すること。
4
プログラミングに関する質問時間
月曜日と金曜日の12:00から13:00までは,
CAE室で,プログラミングに関する質問を受け付
けています.
遠慮なく相談に来てください.
5
今日の内容
• ファイルへの入出力
– fprintf関数
– fscanf関数
– fputs関数
– fgets関数
6
ファイル操作の基本
• ファイルの読み書きは以下の手順で行う.
fprintf
fputs
関数
関数
① ファイルをオープン(OPEN)する
② ファイルを 読み / 書きする
③ ファイルをクローズ(CLOSE)する
fscanf
関数
fgets
関数
①オープン
②読み書き
③クローズ
7
#include <stdio.h>
実行結果(ファイルの中身)
main()
{
FILE *fp;
int i;
double x = 1.3;
答えは次ページへ
ファイルをオープン
//1.ファイルをオープン
fp = fopen(“input.txt”, “w”);
//2.ファイルに書きこむ
小数第1位
まで表示
for (i = 0; i < 3; i++)
fprintf(fp, “%.1lf\n”, x + 0.4*i);
//3.ファイルをクローズ
fclose(fp);
}
ファイルに書き込み
ファイルをクローズ
8
テキストファイルの例
input.txt
1.3
1.7
2.1
テキストファイルとは:
・文字コードだけで構成されたファイル.
・メモ帳,Wordなどで編集することができる.
・拡張子は「txt」を指定する.
9
ファイルからの読み込み(fscanf関数)
• fopen関数でオープンモードを”r”に指定
• オープンしたファイルに対して,書式付でデー
タを読み込む.
• 第1引数にファイルポインタを指定する.
• 書式指定の方法はscanf関数と同様
構文:
fscanf(fp, 書式指定文字列)
使用例:
input.txtから実数型
FILE *fp;
としてファイルの先頭
double x;
の値をxという変数に
fp = fopen(“input.txt”, “r”);
読み込む
fscanf(fp, “%lf”, &x);
printf(“読み込んだ値は%lf”,x);
10
#include <stdio.h>
実行結果
main()
{
FILE *fp;
double x, y, z;
変数xは?
変数yは?
変数zは?
1.3
1.7
2.1
//1.ファイルをオープン
fp = fopen(“input.txt”, “r”);
ファイルを読み込みモードで
オープン
//2.ファイルから値を読み込む
fscanf(fp, “%lf”, &x);
fscanf(fp, “%lf”, &y);
fscanf(fp, “%lf”, &z);
//3.ファイルをクローズ
fclose(fp);
}
ファイルから3つの値を
順に読み込む
ファイルをクローズ
11
ファイルからの書き込み(fputs関数)
•
•
•
•
fopen関数でオープンモードを”w”に指定
オープンしたファイルに対して,1行書き込む
ファイルポインタは第2引数に指定する.
改行コードが自動的に追加されない
構文:
fputs (書き込む文字列,fp)
使用例:
message.txtに文字列
FILE *fp;
を書き込む
char str1[50] = “Thank you!\n”;
char str2[50] = “Good Bye.”;
fp = fopen(“message.txt”, “w”);
fputs(str1, fp);
fputs(str2, fp);
12
テキストファイルの例
message.txt
Thank you!
Good Bye.
13
ファイルからの読み込み(fgets関数)
• fopen関数でオープンモードを”r”に指定
• オープンしたファイルから,1行読み込む.
• ファイルの最後の行を読むと,戻り値として
NULLを返す
• 第2引数に最大文字数を指定する.
• 第3引数にファイルポインタを指定する.
• 読み取る文字には,改行コードも含まれる
14
ファイルからの読み込み(fgets関数)
構文: fgets (文字列の格納アドレス,最大文字数,
ファイルポインタ)
使用例: FILE *fp;
char str[100];
fp = fopen(“message.txt”, “r”);
fgets(str, 50, fp);
printf(“1行目は%s”,str);
message.txtから1行目
をstrに読み込む
15
#include <stdio.h>
main()
{
追記モード
FILE *fp;
(末尾に追
char str[50];
加される)
//書き込み
fp = fopen(“message.txt”, “a”);
puts(“文字列を入力してください”);
入力された文字列strを
gets(str);
ファイルに書き込み
fputs(str, fp);
fclose(fp);
//読み込み
fp = fopen(“message.txt”, “r”);
fgets(str, 50, fp);
puts(str);
fclose(fp);
}
ファイルから1行を読み
出し,strに格納
16
ファイルのすべての行を読み出す
(fgetsの使い方)
• fgetsの戻り値(char型へのポインタ)がNULLで
あれば,読み出しが終わったことを表す
char *p;
FILE *fp;
char str[100];
int count = 0;
・・・
p = fgets(str, 100, fp);
while (p != NULL) {
count++;
printf(“%d行: %s”, count, str);
p = fgets(str, 100, fp);
}
簡略化
FILE *fp;
char str[100];
int count = 0;
・・・
while (fgets(str) != NULL) {
count++;
printf(“%d行: %s”, count, str);
}
17
ファイルのすべてを読み出す
(fscanfの使い方)
• fscanfの戻り値(int型)がEOFであれば,読み
出しが終わったことを表す
int end;
簡略化
FILE *fp;
FILE *fp;
char str[100];
char str[100];
int count = 0;
int count = 0;
・・・
・・・
end = fscanf(fp, “%d”, str);
while (end != EOF) {
while (fscanf(fp, “%d”, str) != EOF) {
count++;
count++;
printf(“%d行: %s\n”, count, str); printf(“%d行: %s\n”, count, str);
end = fscanf(fp, “%d”, str);
}
}
18
scanfの応用
• scanf(“%d”, &x)
xに値を一つ入力
• scanf(“%d %d”, &x, &y)
挟んで入力
xとyをスペースを
• scanf(“%d,%d”, &x,&y) xとyをカンマ区切りで
入力
19
fscanfの応用
読み込むファイル(スペース区切りで2列にデータが並んでいる)
10 1.2
20 3.4
30 5.6
int x;
double y;
fscanf( fp, “%d %lf”, &x, &y);//1行で2列読む