C言語初心者必見!fgets関数を使いこなす5つのステップ

C言語のfgets関数の使い方を解説するイラストC言語

 

【当サイトはコードのコピペ・商用利用OKです】

このサービスはASPや、個別のマーチャント(企業)による協力の下、運営されています。

記事内のコードは基本的に動きますが、稀に動かないことや、読者のミスで動かない時がありますので、お問い合わせいただければ個別に対応いたします。

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10000時間以上』を満たすプログラマ集団によって監修されています。

はじめに

C言語はコンピュータのプログラミング言語の1つで、多くの現代のプログラミング言語の基礎となっています。

その中で、今回紹介するfgets関数は、特に初心者の方々にとって重要な関数の一つと言えます。

この記事では、C言語のfgets関数の基本的な使い方から詳細な対処法、注意点、そしてカスタマイズ方法までを解説していきます。

初心者の方でも理解しやすいように説明しますので、ぜひ最後までお読みください。

●C言語とは

C言語は、1970年代に米国のAT&Tベル研究所で開発された汎用プログラミング言語です。

そのパワフルさと直感的な記述方法から広く利用され、現代の多くのプログラミング言語の元となっています。

C言語は、オペレーティングシステムやハードウェアに近いプログラミングを行うことが可能で、組み込みシステムやシステムプログラミングに多く利用されています。

●fgets関数とは

fgets関数はC言語の基本的な入力関数の一つです。

この関数を用いると、ファイルや標準入力から一行の文字列を取得することができます。

○基本的な使い方

fgets関数の基本的な使い方は次の通りです。

char buffer[256];
fgets(buffer, sizeof(buffer), stdin);

このコードでは、まず256文字分の空間を確保したchar型の配列bufferを作成しています。

そして、fgets関数を使って、標準入力(stdin)から一行分の文字列を読み込んでbufferに保存しています。

sizeof関数は、bufferが確保できる文字数(この場合は256文字)を返す関数です。

これにより、fgets関数はbufferのサイズを超える入力を受け取ると、それを切り捨てることができます。

○詳細な使い方

fgets関数のより詳細な使い方を見ていきましょう。fgets関数はファイルからも文字列を読み込むことができます。

そのため、次のようにファイルから読み込む場合のコードも可能です。

FILE *fp = fopen("sample.txt", "r");
char buffer[256];
if (fp != NULL) {
    fgets(buffer, sizeof(buffer), fp);
    fclose(fp);
}

このコードでは、まずfopen関数を使って”sample.txt”という名前のファイルを読み込みモード(“r”)で開いています。

そして、同様に256文字分の空間を確保したchar型の配列bufferを作成し、fgets関数でファイルから一行分の文字列を読み込んでいます。

最後にfclose関数でファイルを閉じています。

これにより、指定したファイルからテキストを一行読み込むことができます。

□サンプルコード1:基本的なfgetsの使い方

今回は最も基本的なfgets関数の使い方をご紹介します。

このコードでは、一行のテキストを読み取るためにfgets関数を使います。

文字列の入力を受け取り、それを出力するというシンプルな操作を実現します。

下記のコードでは、fgets関数を使用してユーザーからの入力を読み取り、それをそのまま表示します。

#include <stdio.h>

int main() {
    char str[100];  // 文字列を格納するための配列
    printf("何かテキストを入力してください:\n");  // ユーザーにメッセージを表示

    // fgets関数を使ってユーザーの入力を読み込む
    fgets(str, sizeof(str), stdin);

    printf("あなたの入力: %s\n", str);  // 入力された文字列を表示

    return 0;
}

ここで、fgets(str, sizeof(str), stdin);という行がポイントです。fgets関数は、第一引数に文字列を格納するための配列、第二引数に配列のサイズ、第三引数に読み込むストリーム(ここでは標準入力stdin)を指定します。

このコードを実行すると、ユーザーが入力したテキストがそのまま画面に表示されます。

例えば、「こんにちは」と入力した場合、プログラムは「あなたの入力: こんにちは」と表示します。

このコードは基本的なfgetsの使い方を示していますが、fgetsの真価は、大きなテキストファイルを安全に読み込むことができる点にあります。

その詳細な使い方については、次の節で詳しく説明します。

□サンプルコード2:fgetsを使った入力の受け取り方

次に、fgets関数を使って、ファイルからテキストを読み込む方法について見てみましょう。

この例では、指定したテキストファイルを開き、その内容を行ごとに読み取って表示します。

#include <stdio.h>

int main() {
    char str[100];  // 文字列を格納するための配列
    FILE *file;     // ファイルポインタ

    // ファイルを開く
    file = fopen("test.txt", "r");
    if (file == NULL) {  // ファイルが開けなかった場合
        printf("ファイルが開けません\n");
        return 1;
    }

    // ファイルの内容を行ごとに読み込み、表示する
    while (fgets(str, sizeof(str), file) != NULL) {
        printf("%s", str);
    }

    fclose(file);  // ファイルを閉じる

    return 0;
}

このコードでは、まずfopen関数を使ってファイルを開きます。

そして、fgets関数を使ってファイルの内容を行ごとに読み込み、読み込んだ内容を表示します。

最後に、fclose関数を使ってファイルを閉じます。

このコードを実行すると、「test.txt」ファイルの内容がそのまま画面に表示されます。

●fgets関数の詳細な対処法

fgets関数の活用法を理解したところで、それを用いる上での詳細な対処法について解説していきます。

fgets関数は非常に便利な一方、適切に扱わないとエラーやバグの原因となる可能性もあります。

そこで、ここではfgets関数で発生する可能性のある問題とその対処法について見ていきます。

○fgets関数のエラーハンドリング

プログラムを書く上でエラーハンドリングは避けて通れない重要な要素です。

fgets関数もまた、エラーハンドリングが必要な関数の一つです。

ファイルを開いてデータを読み込む際、様々な理由でエラーが発生する可能性があります。

例えば、開こうとしたファイルが存在しない場合や、ファイルが開けない場合などです。

このような場合に適切にエラーハンドリングを行うことで、プログラムが意図しない動作をするのを防ぐことができます。

□サンプルコード3:fgetsとエラーハンドリング

下記のサンプルコードでは、fgets関数を用いてファイルからデータを読み込む際のエラーハンドリングを表しています。

#include <stdio.h>

int main(void) {
    char buffer[256];
    FILE *file = fopen("test.txt", "r");

    // ファイルが開けない場合のエラーハンドリング
    if (file == NULL) {
        printf("ファイルが開けません\n");
        return 1;
    }

    // fgets関数を使ったデータの読み込みとエラーハンドリング
    if (fgets(buffer, sizeof(buffer), file) == NULL) {
        printf("データを読み込めません\n");
        fclose(file);
        return 1;
    }

    printf("%s\n", buffer);

    fclose(file);
    return 0;
}

このコードではまず、fopen関数でファイルを開きます。

そして、その結果がNULLかどうかをチェックし、ファイルが開けない場合にはエラーメッセージを表示してプログラムを終了します。

このように、エラーハンドリングを行うことで、ファイルが存在しない場合などにも対応することができます。

次に、fgets関数でファイルからデータを読み込みます。

fgets関数もまた、エラーが発生した場合にはNULLを返すので、その結果をチェックします。

データの読み込みに失敗した場合にはエラーメッセージを表示してプログラムを終了します。

最後に、読み込んだデータを表示し、ファイルを閉じてプログラムを終了します。

このコードを実行すると、test.txtというファイルからデータを読み込み、それを表示します。

しかし、test.txtが存在しない場合や、何らかの理由でデータの読み込みに失敗した場合には、それぞれのエラーメッセージが表示され、プログラムは終了します。

このように、エラーハンドリングを行うことで、プログラムが意図しない動作をするのを防ぐことができます。

そのため、fgets関数を使う際にはエラーハンドリングを適切に行うことが重要です。

●fgets関数の注意点

C言語初心者の皆さん、fgets関数の注意点について詳しく解説します。

fgets関数は非常に便利な関数ですが、注意しなければならない点もあります。

その一つが「バッファオーバーフロー」です。

これは、fgets関数がデータを読み込む際、指定されたバッファの容量を超えてデータを読み込むと発生する問題です。

この問題を避けるためには、fgets関数を正しく使いこなすことが重要です。

○バッファオーバーフローとは

バッファオーバーフローとは、メモリ上のバッファに格納されるデータ量がバッファの容量を超えてしまう現象のことを指します。

この現象が発生すると、バッファの隣接するメモリ領域にデータが書き込まれてしまい、プログラムの不具合やシステムの安全性に影響を及ぼすことがあります。

□サンプルコード4:バッファオーバーフローの防止

下記のサンプルコードでは、fgets関数を用いてユーザからの入力を取得し、バッファオーバーフローを防ぐ方法を紹介します。

この例では、最大10文字の入力を受け取ることができます。

#include <stdio.h>

int main(void) {
    char buffer[11];
    printf("最大10文字の入力を受け付けます:");
    fgets(buffer, sizeof(buffer), stdin);
    printf("入力された文字列:%s\n", buffer);
    return 0;
}

このコードでは、fgets関数の第二引数にバッファのサイズを指定しています。

このサイズ指定により、fgets関数がバッファのサイズを超えるデータを読み込むことが防がれます。

このコードを実行すると、ユーザは最大10文字の入力を求められます。

そして、入力された文字列がそのまま出力されます。

例えば、”HelloWorld”と入力すれば、結果は”入力された文字列:HelloWorld”と表示されます。

しかし、もし11文字以上の文字列を入力した場合はどうでしょうか。

例えば、”HelloWorld!!”と入力した場合、出力結果は”入力された文字列:HelloWorld”となります。

入力された11文字以上の文字列は切り捨てられ、バッファオーバーフローが防止されていることが確認できます。

●fgets関数のカスタマイズ

C言語のプログラム作成において、一つの関数だけでは解決できない問題が発生する場合があります。

そういったときに役立つのが、既存の関数を活用して新たな関数を作成すること、つまり「関数のカスタマイズ」です。

fgets関数も例外ではありません。

基本的な読み込み機能以外にも、特定の用途に合わせた機能を持たせることで、より強力なツールとして活用することができます。

ここでは、fgets関数をベースにした独自の関数を作成する方法について解説します。

○fgets関数のバリエーション

fgets関数は非常にシンプルな関数で、その分、扱いやすいという特徴があります。

しかし、それゆえに柔軟性が少なく、特定の用途に合わせて動作を調整するのは難しいかもしれません。

そこで、特定の用途に合わせてfgets関数をカスタマイズし、独自の関数を作成することで、より便利に利用することが可能です。

例えば、fgets関数を使用して一行読み込む際、末尾の改行文字を削除する独自の関数を作成することができます。

これにより、入力データの処理を行う際に改行文字を考慮する必要がなくなります。

では、この独自の関数を実装するためのサンプルコードを見てみましょう。

□サンプルコード5:fgetsを用いた独自の関数の作成

下記のコードは、fgets関数を用いて文字列を読み込み、末尾の改行文字を削除する関数を作成しています。

#include<stdio.h>
#include<string.h>

// 末尾の改行を削除する関数
void chomp(char *s) {
    int len = strlen(s);
    if (s[len - 1] == '\n') {
        s[len - 1] = '\0';
    }
}

// fgetsを用いて読み込み、末尾の改行を削除する関数
void fgets_chomp(char *s, int size, FILE *stream) {
    fgets(s, size, stream);
    chomp(s);
}

int main() {
    char s[100];

    printf("何か文字列を入力してください:");
    fgets_chomp(s, sizeof(s), stdin);

    printf("入力された文字列:%s\n", s);

    return 0;
}

このサンプルコードでは、まず「chomp」という名前の関数を定義しています。

chomp関数は引数として文字列を受け取り、その文字列の末尾が改行文字(‘\n’)であればそれをNULL文字(‘\0’)に置き換えています。

これにより、文字列の末尾の改行文字を削除することができます。

次に、「fgets_chomp」という名前の関数を定義しています。

この関数はfgets関数と同じ引数を取り、fgets関数を用いて文字列を読み込んだ後、先ほど定義したchomp関数を呼び出して読み込んだ文字列の末尾の改行文字を削除します。

このコードを実行すると、まず「何か文字列を入力してください:」と表示されます。

この時にキーボードから何か文字列を入力しEnterキーを押すと、その文字列が表示されます。

しかし、fgets関数のみを使用した場合と違い、末尾に改行文字が付いていないことに注意してください。

●応用例とサンプルコード

fgets関数は、その柔軟性からさまざまな応用が可能です。

それではその一例として、fgets関数を使ったファイルの読み込み方について詳しく説明します。

○fgets関数を使ったファイルの読み込み

C言語では、ファイルの読み書きを行うことができます。

その際に役立つのが、先ほど紹介したfgets関数です。

fgets関数は、ファイルから一行ずつ文字列を読み取ることができるため、ファイルの内容を順次処理する際に有効です。

□サンプルコード6:fgetsを使ったファイルの読み込み

#include <stdio.h>

int main() {
    FILE *fp;
    char buffer[255];

    fp = fopen("sample.txt", "r");
    if (fp == NULL) {
        printf("ファイルが開けません\n");
        return 1;
    }

    while (fgets(buffer, 255, fp) != NULL) {
        printf("%s", buffer);
    }

    fclose(fp);

    return 0;
}

このコードでは、fgets関数を使って「sample.txt」ファイルを一行ずつ読み込んで出力する処理を行います。

まず、fopen関数を使用して、読み込みモード(”r”)で「sample.txt」ファイルを開きます。

次に、fgets関数を使ってファイルから一行ずつ読み取り、その内容をbufferに格納します。

そして、printf関数を使ってその内容を出力します。

このプロセスは、fgets関数がNULLを返す(つまり、ファイルの終わりに達する)まで続きます。

実行結果としては、「sample.txt」ファイルの内容がコンソールに一行ずつ表示されます。

この例からもわかるように、fgets関数はファイルの読み込みにも適しています。

一行ずつ処理を行うことが必要な場合や、特定の文字列を検索する際などにも活用できます。

まとめ

今回の記事では、C言語のfgets関数の使い方を初心者向けに解説しました。

基本的な使い方から詳細な使い方、注意点、エラーハンドリングの方法、カスタマイズの方法、そして具体的な応用例まで、fgets関数を使いこなすための情報を網羅的に紹介しました。

C言語のプログラミングでは、標準入力からの文字列読み取りだけでなく、ファイルからの読み取りなど、さまざまな場面でfgets関数が役立ちます。

この記事を参考に、ぜひfgets関数を活用してみてください。

これで、C言語初心者でもfgets関数を使いこなすことができるようになります。

また、C言語に限らず、他の言語でも類似の関数が存在することが多いです。

そのため、fgets関数の理解は、他のプログラミング言語への理解にもつながります。

C言語プログラミングの学習は、基本的な構文から始め、徐々に関数の使い方や、エラーハンドリングの方法など、より高度な内容を理解していくことが大切です。

今後もC言語の学習を進める際は、この記事を参考にしてください。