第11回:配列とファイル

今週は,「ファイルからデータを配列に読みこむ」,「配列のデータをファイルへ書き込む」ことを学びます.


【練習の答え】

○ キーボードから入力した数値をファイルに保存するプログラムを作成する

#include <stdio.h>

void main()
{
    int a;
    FILE *fp;

    if((fp = fopen("test.txt", "w")) == NULL){
        printf("ファイルを作れませんでした");
        return;
    }

    printf("ファイルに保存する数字:");
    scanf("%d", &a);

    fprintf(fp, "%d", a);

    fclose(fp);
}

○ ファイルに保存された数値を読み込み,画面に表示するプログラムを作成する

#include <stdio.h>

void main()
{
    int a;
    FILE *fp;

    if((fp = fopen("test.txt", "r")) == NULL){
        printf("ファイルを開けませんでした");
        return;
    }

    fscanf(fp, "%d", &a);

    printf("%d", a);

    fclose(fp);
}


では,ファイルから10個のデータを読み込んで,画面に表示するにはどうしたら良いでしょう.

データは,配列に読み込みたいですよね.(そんなことはない?)

配列にキーボードからデータを読み込みには,

#include <stdio.h>

void main()
{
    int i, n;
    int data[10];

    for(i = 0; i < 10; i++) {
        printf("%d番目のデータ:", i+1); scanf("%d", &(data[i]));
    }

    for(i=0; i<10; i++) printf("%d\n", data[i]);
}  

となります.これをファイルから読み込むように変えてみましょう.

#include <stdio.h>

void main()
{
    int i, n;
    int data[10];
    char filename[20];
    FILE *fp;

    printf("読み込むデータファイル名を入力してください : ");
    scanf("%s", filename);

    fp = fopen(filename, "r");
    if(fp == NULL){
        printf("ファイルがありませんでした");
        return;
    }

    for(i = 0; i < 10; i++){
        fscanf(fp, "%d", &(data[i]));
    }

    fclose(fp);

    for(i=0; i<10; i++) printf("%d\n", data[i]);
}  

ここで,事前にデータの個数がわからないとしたら,どうしたらよいだろう?

ファイルの終わりを調べるには,feof()関数を使います.この関数は,ファイルの終わりに達すると,trueになります.

この関数を使って,整数データの並んだファイルから,配列にデータを読み込んでみよう.

#include <stdio.h>

void main()
{
    int i, n;
    int data[256];
    char filename[20];
    FILE *fp;

    printf("読み込むデータファイル名を入力してください : ");
    scanf("%s", filename);

    fp = fopen(filename, "r");
    if(fp == NULL){
        printf("ファイルがありませんでした");
        return;
    }

    i = 0;
    do{
        fscanf(fp, "&d", &(data[i]));
        i++;
    }while(!(feof(fp)));

    fclose(fp);

    n = i; 
    for(i=0; i<n; i++) printf("%d\n", data[i]);
}  

または,for文を使って,

#include <stdio.h>

void main()
{
    int i, n;
    int data[256];
    char filename[20];
    FILE *fp;

    printf("読み込むデータファイル名を入力してください : ");
    scanf("%s", filename);

    fp = fopen(filename, "r");
    if(fp == NULL){
        printf("ファイルがありませんでした");
        return;
    }

    for(i = 0; !(feof(fp)); i++)  fscanf(fp, "%d", &(data[i]));

    fclose(fp);

    n = i; 
    for(i=0; i<n; i++) printf("%d\n", data[i]);
}  

【演習】

100人の試験結果のデータ testdata.txt(100点満点で正の整数)を読み込んで,試験の平均値を求めるプログラムを作ろう.

これができた人は,標準偏差を求めてから各点数の偏差値を求めてみよう.

さらに,できた人は,関数の演習で作成した並べ替えるプログラムを参考にして,成績のよい順に並べ替えて,結果を別のファイルに保存してみよう.