第9回:ファイル

 今週は,データをプログラムに読み込んだり出力したりする際に必要となるファイルの入出力を取り上げます.


【演習の答え】

下記の関数を用いないで書いた,入力されたアルファベットの小文字の文字列をabc順に並べ替えるプログラムを関数を用いて書き換えよう.
#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);
}
				

ファイルとは

 「あるまとまりをもったデータの集まり」のことをファイルと呼びます.紙を束ねたものをファイルと呼ぶのと同じ概念です.コンピュータのメモリ上のデータは電源を切ると消えてしまいますが,外部記憶装置(ハードディスクやフロッピーディスク)にまとめて記録(ファイル)しておけば,後で読み出すことができます.これまで作ってきたプログラムファイルや様々な画像データ,電子メールなどもファイルとして扱われます.

 ファイルには,大きく分けて二種類あります.

テキストファイル
C言語のプログラムリストや,ホームページのファイルなど,人間が中身を読むことのできるファイル
バイナリファイル
プログラムの実行ファイルや,画像ファイル音楽のファイルなど,文字として読めないファイル

ファイル操作の基本

  1. ファイルを開く(オープン)
  2. ファイルに読み書きする
  3. ファイルを閉じる(クローズ)


<復習>キーボードから入力した文字を画面に出力する

 画面からデータを読み書きするのに用いた,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
....

ファイルが出力できたら,できたファイルをエクセルを用いて開いてみよう.