Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語の高レベルI/O関数とは?種類・構文・使い方を実例付きで徹底解説

I/Oとは、C言語における入力(Input)・出力(Output)関数のことを指します。ファイル操作を行う際には、大きく分けて「高レベルI/O」と「低レベルI/O」の2種類があり、それぞれ特徴や用途が異なります。本記事では、高レベルI/O関数の種類や構文、具体的な使い方をサンプルプログラムとともに詳しく解説します。

高レベルI/Oと低レベルI/Oの違い

高レベルI/O

  • 人間にとって理解しやすい形式で入出力を行う。
  • 最大の利点は移植性(ポータビリティ)の高さ。OSや環境に依存せずに動作する。

低レベルI/O

  • コンピュータ(ハードウェア)にとって理解しやすい形式で入出力を行う。
  • 利点は実行時間が短いこと。
  • 欠点は移植性がないこと。環境に依存するため、異なるシステムでは動作しない場合がある。

主な高レベルI/O関数の一覧

C言語でよく使われる高レベル入出力(I/O)関数は以下の通りです。

関数名説明
fprintf( )ファイルにデータを書き込む
fscanf( )ファイルからデータを読み込む
putc( ) / fputc( )ファイルに1文字書き込む
getc( ) / fgetc( )ファイルから1文字読み込む
putw( )ファイルに数値を書き込む
getw( )ファイルから数値を読み込む
fputs( )ファイルに文字列を書き込む
fgets( )ファイルから文字列を読み込む
fread( )ファイルからレコード全体を読み込む
fwrite( )ファイルにレコード全体を書き込む

fprintf( ) と fscanf( ) 関数

fprintf( )

fprintf( )は、printf( )と同様の書式指定を使って、ファイルにデータを書き込むための関数です。

構文は以下の通りです。

fprintf(ファイルポインタ, "制御文字列", 変数リスト);

記述例:

FILE *fp;
fprintf(fp, "%d%c", a, b);

fscanf( )

fscanf( )は、scanf( )と同様の書式指定を使って、ファイルからデータを読み込むための関数です。

構文は以下の通りです。

fscanf(ファイルポインタ, "制御文字列", &変数リスト);

記述例:

FILE *fp;
fscanf(fp, "%d%c", &a, &b);

putc( ) と getc( ) 関数

putc( )

putc( )は、ファイルに1文字書き込むために使用します。

構文は以下の通りです。

putc(char ch, FILE *fp);

記述例:

FILE *fp;
char ch;
putc(ch, fp);

getc( )

getc( )は、ファイルから1文字読み込むために使用します。

構文は以下の通りです。

char getc(FILE *fp);

記述例:

FILE *fp;
char ch;
ch = getc(fp);

putw( ) と getw( ) 関数

putw( )

putw( )は、ファイルに整数値(数値)を書き込むために使用します。

構文は以下の通りです。

putw(int num, FILE *fp);

記述例:

FILE *fp;
int num;
putw(num, fp);

getw( )

getw( )は、ファイルから整数値(数値)を読み込むために使用します。

構文は以下の通りです。

int getw(FILE *fp);

記述例:

FILE *fp;
int num;
num = getw(fp);

fputc( ) と fgetc( ) 関数

fputc( )

fputc( )は、ファイルに1文字書き込むために使用します。putc( )とほぼ同じ働きをします。

構文は以下の通りです。

fputc(char ch, FILE *fp);

記述例:

FILE *fp;
char ch;
fputc(ch, fp);

fgetc( )

fgetc( )は、ファイルから1文字読み込むために使用します。

構文は以下の通りです。

int fgetc(FILE *fp);

記述例:

FILE *fp;
char ch;
ch = fgetc(fp);

fgets( ) と fputs( ) 関数

fgets( )

fgets( )は、ファイルから文字列を読み込むために使用します。

構文は以下の通りです。

fgets(文字列変数, 読み込む文字数, ファイルポインタ);

記述例:

FILE *fp;
char str[30];
fgets(str, 30, fp);

fputs( )

fputs( )は、ファイルに文字列を書き込むために使用します。

構文は以下の通りです。

fputs(文字列変数, ファイルポインタ);

記述例:

FILE *fp;
char str[30];
fputs(str, fp);

fread( ) と fwrite( ) 関数

fread( )

fread( )は、構造体などのレコード全体を一度に読み込むために使用します。

構文は以下の通りです。

fread(&構造体変数, sizeof(構造体変数), レコード数, ファイルポインタ);

記述例:

struct emp {
    int eno;
    char ename[30];
    float sal;
} e;
FILE *fp;
fread(&e, sizeof(e), 1, fp);

fwrite( )

fwrite( )は、構造体などのレコード全体を一度に書き込むために使用します。

構文は以下の通りです。

fwrite(&構造体変数, sizeof(構造体変数), レコード数, ファイルポインタ);

記述例:

struct emp {
    int eno;
    char ename[30];
    float sal;
} e;
FILE *fp;
fwrite(&e, sizeof(e), 1, fp);

サンプルプログラム①:数値の書き込みと読み込み

次のCプログラムは、1から10までの数値をファイルに保存し、その内容を読み出して表示するものです。

// 1から10までの数値を保存して表示するプログラム
#include <stdio.h>
int main(void) {
    FILE *fp;
    int i;

    fp = fopen("num.txt", "w");
    for (i = 1; i <= 10; i++) {
        putw(i, fp);
    }
    fclose(fp);

    fp = fopen("num.txt", "r");
    printf("file content is ");
    for (i = 1; i <= 10; i++) {
        i = getw(fp);
        printf("%d", i);
    }
    fclose(fp);
    return 0;
}

実行結果

上記のプログラムを実行すると、以下のような結果が出力されます。

file content is12345678910

サンプルプログラム②:学生情報の保存と表示(fread/fwriteの活用)

次に、5人分の学生情報をファイルに保存し、fread( )とfwrite( )を使って読み書きするCプログラムの例を紹介します。

#include <stdio.h>
struct student {
    int sno;
    char sname[30];
    float marks;
    char temp;
};

main(void) {
    struct student s[60];
    int i;
    FILE *fp;

    fp = fopen("student1.txt", "w");
    for (i = 0; i < 2; i++) {
        printf("enter details of student %d\n", i + 1);
        printf("student number:");
        scanf("%d", &s[i].sno);
        scanf("%c", &s[i].temp);
        printf("student name:");
        gets(s[i].sname);
        printf("student marks:");
        scanf("%f", &s[i].marks);
        fwrite(&s[i], sizeof(s[i]), 1, fp);
    }
    fclose(fp);

    fp = fopen("student1.txt", "r");
    for (i = 0; i < 2; i++) {
        printf("details of student %d are\n", i + 1);
        fread(&s[i], sizeof(s[i]), 1, fp);
        printf("student number = %d\n", s[i].sno);
        printf("student name = %s\n", s[i].sname);
        printf("marks = %f\n", s[i].marks);
    }
    fclose(fp);
    getch();
}

実行結果

上記のプログラムを実行すると、以下のような結果が出力されます。

enter details of student 1
student number:1
student name:bhanu
student marks:50
enter details of student 2
student number:2
student name:priya
student marks:69
details of student 1 are
student number = 1
student name = bhanu
marks = 50.000000
details of student 2 are
student number = 2
student name = priya
marks = 69.000000

まとめ

C言語の高レベルI/O関数は、移植性が高く人間にも扱いやすいのが大きな特徴です。文字単位の処理にはputc( )/getc( )、数値にはputw( )/getw( )、文字列にはfgets( )/fputs( )、構造体などのまとまったデータにはfread( )/fwrite( )といったように、目的に応じて適切な関数を選択することが重要です。これらの関数を使いこなせるようになると、ファイルを活用した実用的なプログラムが効率的に作成できるようになります。

  1. C言語のシフト演算とは?左シフト・右シフト・補数の基本をわかりやすく解説

    問題 C言語を使用して、ある数値に対する左シフト・右シフト・補数(ビット反転)を求める簡単なプログラムを作成するには、どのようにすればよいのでしょうか。 解決方法 左シフト(<<) 変数の値を1ビットだけ左へシフトすると、その値は2倍になります。「a × 2」を計算したのと同じ結果です。 例:a = 10 の場合、a << 1 = 20 右シフト(>>) 変数の値を1ビットだけ右へシフトすると、その値は元の半分になります。「a ÷ 2」の整数除算と同じ結果です。 例:a = 10 の場合、a >> 1 = 5 サンプルプログラム 以下は、シ

  2. C言語の探索アルゴリズム解説|線形探索と二分探索の違いと実装例

    探索(サーチ)とは、複数の要素で構成されるリストの中から、目的の「キー」となる要素を見つけ出す処理のことです。 リストの中に指定した要素が存在すれば、その探索は「成功」とみなされます。 指定した要素がリストに存在しなければ、その探索は「失敗(不成功)」となります。 C言語で広く使われている代表的な探索手法は、主に次の2つです。 線形探索(Linear Search/リニアサーチ) 二分探索(Binary Search/バイナリサーチ) 線形探索(Linear Search)とは 線形探索は、リストの先頭から順に要素を1つずつ取り出し、キーと一致するかどうかを確認していく、最も基本的な探