C言語でread関数を使いこなすための5つの手引き

C言語のread関数を学ぶ初心者のためのガイドC言語
この記事は約5分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

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

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

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

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

プログラミング言語とは、コンピュータに指示を出すための手段です。

その中でも、C言語は低レベル操作が可能なだけでなく、その独特な文法と構造から新しい言語を学ぶ足がかりとなる特徴を持っています。

本日はC言語のread関数を詳しく解説します。

使い方の基本から、具体的な応用例、そしてカスタマイズまでを解説していきます。

●C言語のread関数とは

read関数は、C言語でファイルやデバイスからデータを読み込むために用いられます。

POSIX準拠のオペレーティングシステムでは、これを使用してデータの入出力を行うことができます。

この関数は次のような形で使用されます。

ssize_t read(int fd, void *buf, size_t count);

ここでfdはファイル記述子、bufは読み込んだデータを格納するバッファ、countは読み込むバイト数を指定します。

●read関数の詳細な使い方

○使い方の基本

基本的には上記の形式に従い、read関数を利用します。

戻り値は読み込んだバイト数になります。エラーが発生した場合やEOFに達した場合は-1が返ります。

○サンプルコード1:基本的なread関数の使用例

ここでは、read関数を用いて一定量のデータを読み込む基本的な使用例を紹介します。

#include <fcntl.h>
#include <unistd.h>

int main() {
    int fd;
    char buf[10];
    ssize_t n;

    fd = open("sample.txt", O_RDONLY);
    if (fd == -1) {
        // ファイルオープン失敗時の処理
        return 1;
    }

    n = read(fd, buf, sizeof(buf) - 1);
    if (n == -1) {
        // ファイル読み込み失敗時の処理
        return 1;
    }

    buf[n] = '\0';  // 文字列の終端を表す

    close(fd);

    return 0;
}

このコードではsample.txtというファイルを開いて、最大9バイトのデータを読み込みます。

読み込んだデータはbufに格納され、そのサイズはnに格納されます。

その後、bufの最後に終端文字を追加して、文字列として扱えるようにしています。

●read関数の応用例

○サンプルコード2:read関数を用いたファイル読み込み

次に、read関数を用いてファイル全体を読み込む例を見ていきましょう。

ここでは、先ほどとは異なり、read関数をループ内で使用しています。

#include <fcntl.h>
#include <unistd.h>

#define BUF_SIZE 256

int main() {
    int fd;
    char buf[BUF_SIZE];
    ssize_t n;

    fd = open("sample.txt", O_RDONLY);
    if (fd == -1) {
        // ファイルオープン失敗時の処理
        return 1;
    }

    while ((n = read(fd, buf, sizeof(buf) - 1)) > 0) {
        buf[n] = '\0';
        // バッファの内容を利用する処理
    }

    if (n == -1) {
        // ファイル読み込み失敗時の処理
        return 1;
    }

    close(fd);

    return 0;
}

このコードでは、read関数を用いてファイルからデータを256バイトずつ読み込み、それをbufに格納しています。

データがなくなるまでこの操作を繰り返します。

これにより、ファイル全体を読み込むことができます。

○サンプルコード3:エラーハンドリングを含むread関数の使用例

最後に、エラーハンドリングを考慮したread関数の使用例を見ていきましょう。

#include <fcntl.h>
#include <unistd.h>

#define BUF_SIZE 256

int main() {
    int fd;
    char buf[BUF_SIZE];
    ssize_t n;

    fd = open("sample.txt", O_RDONLY);
    if (fd == -1) {
        // ファイルオープン失敗時の処理
        return 1;
    }

    while ((n = read(fd, buf, sizeof(buf) - 1)) > 0) {
        buf[n] = '\0';
        // バッファの内容を利用する処理
    }

    if (n == -1) {
        // ファイル読み込み失敗時の処理
        close(fd);
        return 1;
    }

    close(fd);

    return 0;
}

上記のコードでは、read関数がエラーを返した場合にもリソースを適切に解放するために、ファイル記述子をcloseしています。

これにより、エラーが発生した際にもリソースリークを防ぐことができます。

●read関数の注意点と対処法

read関数を使用する際の注意点として、まずファイルのオープン失敗やread関数のエラーを適切にハンドリングすることが重要です。

また、read関数は要求したバイト数を完全に読み込むとは限らないため、返されたバイト数を確認し、必要に応じて処理を行うことが求められます。

●read関数のカスタマイズ方法

read関数自体をカスタマイズすることは少ないですが、具体的な使用状況に合わせて、バッファのサイズを変えたり、エラーハンドリングをカスタマイズすることはよくあります。

例えば、ファイルの内容によってバッファのサイズを動的に変更するといった処理が考えられます。

まとめ

C言語のread関数は、ファイルやデバイスからデータを読み込む際に頻繁に利用される関数です。

基本的な使い方から応用例、エラーハンドリング、そしてカスタマイズ方法までを紹介しました。

これらの知識を活かし、read関数を使いこなしましょう。