今週は,データをプログラムに読み込んだり出力したりする際に必要となるファイルの入出力を取り上げます.
#include <stdio.h> int nagasa(char *str) { int i; for(i = 0; str[i] != 0x00; i++); return(i); } void swap(char *a, char *b) { char t; t = *a; *a = *b; *b = t; } void sort(char *s) { int i, j, n; n = nagasa(s); for(i=0; i < n-1; i++){ for(j=i+1; j < n; j++){ if(s[i] > s[j]){ swap(&(s[i]), &(s[j])); } } } } void main() { char s[256]; printf("単語を入力してください\n"); scanf("%s", s); printf("入力された文字列は%sです.\n", s); sort(s); printf("結果 : %s\n", s); }
「あるまとまりをもったデータの集まり」のことをファイルと呼びます.紙を束ねたものをファイルと呼ぶのと同じ概念です.コンピュータのメモリ上のデータは電源を切ると消えてしまいますが,外部記憶装置(ハードディスクやフロッピーディスク)にまとめて記録(ファイル)しておけば,後で読み出すことができます.これまで作ってきたプログラムファイルや様々な画像データ,電子メールなどもファイルとして扱われます.
ファイルには,大きく分けて二種類あります.
画面からデータを読み書きするのに用いた,scanf, printf 関数の復習をしましょう.まず,キーボードから数字を変数nに入力し,つづけて画面上に入力された数字nを表示するプログラムを作ってみよう.
入力 scanf("%d", &n);
出力 printf("%d", n);
じつは,キーボードや画面も,C言語ではファイルとして扱われています.
#include <stdio.h> main() { int i; char filename[20]; FILE *fp; printf("作成するファイル名を入力してください : "); scanf("%s", filename); if((fp = fopen(filename, "w")) == NULL){ printf("ファイルを作れませんでした"); exit(1); } fprintf(fp, "test"); fclose(fp); }
FILE *<ファイルポインタ変数名>
例:FILE *fp;
<ファイルポインタ> = fopen("<ファイル名>","<モード>");
fopen関数により,扱いたいファイルのポインタが,fpに渡されます.ファイルのオープンに失敗すると,fopen関数は,NULLを返します.このため,実際のプログラムでは,下のように書きます.
if ((fp = fopen("filename","r")) == NULL) exit(1);
モード
モード
|
説明 |
r
|
読み込み専用で開く |
w
|
書き込み専用で開く |
a
|
追加書き込みモードで開く
すでにあるデータの後ろに追加,ファイルがなければ,新規作成 |
ファイルの利用が終わったら,プログラムを終了する前に必ずファイルをクローズします.
fclose(<ファイルポインタ>);
これを忘れると,後で痛い目に遭います.
画面からデータを読み書きするのに用いた,scanf, printf 関数に代えて,fscanf, fprintf関数をそれぞれ用います.
fscanf(<ファイルポインタ>, "書式指定子", 引数);
fprintf(<ファイルポインタ>, "書式指定子", 引数);
ファイルからデータを読み込んだり(fscanf),ファイルにデータを書き込むための関数(fprintf)の使い方は,scanf, printf 関数と同じです.違いはどのファイルに読み書きするのかを示すために,ファイルポインタを用いて扱うファイルを特定している点だけです.
ファイル操作の基本に注意しながら...
○ キーボードから入力した数値をファイルに保存するプログラムを作成してみよう
○ ファイルに保存された数値を読み込み,画面に表示するプログラムを作成してみよう
角度を0度から360度まで変えたときの,角度,sin, cosの各値をコンマ","で区切ってファイルに出力するプログラムを作ろう.ファイル名は,"sincos.csv"としよう.sin, cosの関数は,すでにシステムに用意されています.数学関数を使うには,
#include <math.h>
として,プログラムの最初で関数の定義を読み込む必要があります.それぞれ,
double sin(double x);
double cos(double x);
と定義されています.ここで,注意しなくてはいけないのは,三角関数の角度の単位はラジアンであるということです.
プログラムの作り方:
まずはじめに,画面に結果を表示する(ファイルを使わない)ものを作る.
次に,ファイルに出力する.
結果の例:
0, 0.000000, 1.000000
1, 0.017452, 0.999848
2, 0.034898, 0.999391
....
ファイルが出力できたら,できたファイルをエクセルを用いて開いてみよう.