【独学C言語】ファイル関数

※この記事は「2021年5月16日」に更新しました。

前回は、C言語のファイル操作の基本をざっくり紹介しました。

【独学C言語】ファイル操作

【独学C言語】ファイル操作

2020年5月19日

今回は、もう少しファイル関数について、詳しく紹介していきます。

ファイル関数

ファイル関数を紹介します。

fopen関数

fopen関数は、ファイルをオープンするときに使います。

FILE *fopen(char *ファイル名, char *アクセスタイプ);

FILE というのは、stdio.h の中で typedef されています(ファイル構造体)。

アクセスタイプは下記の中から指定することができます。

アクセスタイプ 意味
r 読み込み用にテキストファイルを開く
w 書き込み用にテキストファイルを開く
a テキストファイルに追加する
r+ 読み込み用/書き込み用にテキストファイルを開く
w+ 読み込み用/書き込み用にテキストファイルを作成する
a+ 読み込み用/書き込み用にテキストファイルに追加する

また、アクセスタイプに b を追加することでバイナリファイルに対しても同じ処理を行うことができます。

fclose関数

fclose関数は、ファイルをクローズするときに使います。

int fclose(FILE *ファイルポインタ);

ファイルをオープンして、必要がなくなったら、必ずクローズします。



fputs関数

fputs関数は、ファイルポインタに結び付けられているファイルに文字列を書き込みます。

int fputs(char *文字列, FILE *ファイルポインタ);

ちなみに文字列の終端にある、ヌル文字は書き込まれません。

fgets関数

fgets関数は、ファイルポインタに結び付けられているファイルから文字を読み込みます。

char *fgets(char *文字列, int 数値, FILE *ファイルポインタ);

「数値-1」の文字数を読み込むか、改行文字またはファイルの終わりに達するまで続きます。

fprintf関数

fprintf関数は、ファイルを対象に動作する printf関数です。

int fprintf(FILE *ファイルポインタ, char *制御文字列, ...);

fscanf関数

fscanf関数は、ファイルを対象に動作する scanf関数です。

int fscanf(FILE *ファイルポインタ, char *制御文字列, ...);

特別なファイルポインタ

C言語では、プログラマがオープンしなくても、あらかじめオープンされている特別なファイルポインタがあります。

ファイル名 内容
stdin 標準入力ファイル(キーボードからの入力を表すファイルポインタ)
stdout 標準出力ファイル(モニター画面への出力を表すファイルポインタ)
stderr 標準エラー出力ファイル(モニター画面への出力を表すファイルポインタ)

今まで、標準入力といえば、scanf関数を使っていました。

しかし、stdin というファイルポインタを利用すれば、fgets関数でも標準入力を行うことができます。



サンプルプログラム【C言語】

ファイル関数を理解するためのサンプルプログラムです(C言語)。

sample.c というソースファイルを作成します。

#include <stdio.h>

#define STR_SIZE 256

int main(void)
{
    char str[STR_SIZE];

    fputs("\n", stdout);

    fputs("Input String : ", stdout);
    fgets(&str[0], sizeof(str), stdin);

    fputs("\n", stdout);

    fputs("String is ", stdout);
    fputs(&str[0], stdout);

    fputs("\n", stdout);

    return 0;
}

標準入力と標準出力のファイルポインタを使って、入力と出力を行います。

実行結果は以下の通りです。

ファイル関数

最後に

いかがでしょうか。

今回は、ファイル関数について、紹介しました。

以前にも紹介しましたが、実際のシステム開発では scanf関数を使って入力させるということはまずありません。

なぜなら、開発者が指定した型以外で入力されてしまうと、誤動作を引き起こす可能性が高いからです。

しかし、今回紹介した関数を使って、しっかりバリデーションを行えば、安全なプログラムが実現できそうです。

他にも C言語の標準ライブラリには、多種多様な入出力関数が含まれています。

前回と今回の内容をしっかり理解することができれば、入出力操作を効率良くかつ強力に行うことができるかと思います。