C ファイル I/O: ファイルの作成、オープン、読み取り、書き込み、クローズ

⚡ スマートサマリー

C言語におけるファイル処理では、stdioライブラリを介して永続的なデータをディスクに保存します。stdioライブラリは、fopenでファイルを開き、fputc、fputs、またはfprintfで書き込み、fgetc、fgets、またはfscanfで読み込み、fcloseでファイルを閉じます。

  • 📁 ファイルモード: fopenに渡されるモード文字列(r、w、a、r+、w+、またはa+)によって、ファイルの読み込み、上書き、または追記のいずれが行われるかが決まります。
  • ✍️ データ書き込み: fputcは1文字を書き込み、fputsは文字列を書き込み、fprintfは書式設定されたテキストをファイルポインタに書き込みます。
  • ???? データ読み取り: fgetcは文字を読み込み、fgetsは行をバッファに読み込み、fscanfはファイルからフォーマットされたトークンを解析します。
  • 🔒 ファイルを閉じます: fclose 関数はバッファリングされたデータをフラッシュし、ファイルを解放します。成功した場合は 0 を、失敗した場合は EOF を返します。
  • 🔁 対話型I/O: getcとputcは一度に1文字ずつ処理し、入力された文字をファイルに直接書き込み、再びファイルから出力します。
  • 🤖 AI支援: GitHub CopilotとAIアシスタントは、fopen、fprintf、fgetsルーチンをスキャフォールディングし、NULLチェックの欠落や閉じられていないファイルを検出します。

C ファイル I/O

C ファイル管理

ファイルは、大量の永続データを保存するために使用できます。他の多くの言語と同様に、C言語は以下のファイル管理機能を提供します。 機能,

  1. ファイルの作成
  2. ファイルを開く
  3. ファイルの読み取り
  4. ファイルへの書き込み
  5. ファイルを閉じる

以下は「C」で利用できる最も重要なファイル管理関数です。

function 目的
fopen() ファイルを作成する、または既存のファイルを開く
fclose() ファイルを閉じる
fprintf() データのブロックをファイルに書き込む
fscanf() ファイルからブロックデータを読み取る
getc() ファイルから XNUMX 文字を読み取ります
putc() 単一の文字をファイルに書き込みます
ゲットw() ファイルから整数を読み取ります
載せます() 整数をファイルに書き込む
fseek() ファイル ポインタの位置を指定された場所に設定します
フテル () ファイルポインタの現在位置を返します。
巻き戻し() ファイルポインタをファイルの先頭に設定します

ファイルの作成方法

ファイルを操作する場合、最初のステップはファイルを作成することです。 ファイルは、データが保存されるメモリ内のスペースにすぎません。

「C」プログラムでファイルを作成するには、次の構文が使用されます。

FILE *fp;
fp = fopen ("file_name", "mode");

上記の構文では、ファイルは標準ライブラリで定義されたデータ構造です。

fopen はファイルを開くために使用される標準関数です。

  • ファイルがシステム上に存在しない場合は、ファイルが作成されて開かれます。
  • システムが既にファイルを持っている場合は、この関数を使用して直接ファイルを開きます。

fpはファイルです ポインタ これはタイプファイルを指します。

ファイルを開いたり作成したりするときは、そのファイルで何を行うかを指定する必要があります。C プログラミングでは、読み取り/書き込みの目的でファイルを作成したり開いたりできます。モードは、以下のいずれかの目的でファイルを開くかどうかを指定するために使用されます。以下は、ファイルで作業するときに使用できる C プログラミングのさまざまなタイプのモードです。

ファイルモード 詳細説明
r 読み取り用にファイルを開きます。 ファイルが読み取りモードの場合、ファイルがシステム上にすでに存在する場合、データは削除されません。
w 書き込み用にファイルを開きます。 ファイルが書き込みモードの場合、ファイルが存在しない場合は新しいファイルが作成されます。 ファイルがシステム上にすでに存在する場合、ファイル内のすべてのデータは切り捨てられ、書き込み目的で開かれます。
a ファイルを追記モードで開きます。ファイルが追記モードの場合、ファイルは開かれますが、ファイル内の内容は変更されません。
r+ 最初から読み書き可能
w+ 読み取りと書き込みのために開いて、ファイルを上書きします
a+ 読み取りと書き込みのために開き、ファイルに追加します

指定された構文では、ファイル名とモードは次のように指定されます。 ストリング したがって、それらは常に二重引用符で囲む必要があります。

具体的な例を挙げますと、以下の通りです。

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("data.txt", "w");
}

出力:

コードを保存したのと同じフォルダーにファイルが作成されます。

Cプログラムの出力にファイルを作成する

ファイルを作成するパスを指定できます

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("D://data.txt", "w");
}

C言語で指定されたパスにファイルを作成する

ファイルを閉じる方法

ファイルに対する操作が終了したら、必ずファイルを閉じる必要があります。これは、ファイルの内容とリンクが終了することを意味します。これにより、ファイルが誤って損傷されるのを防ぎます。

'C' では、ファイルを閉じる操作を実行するための fclose 関数が用意されています。fclose の構文は次のとおりです。

fclose (file_pointer);

具体的な例を挙げますと、以下の通りです。

FILE *fp;
fp  = fopen ("data.txt", "r");
fclose (fp);

fclose関数はファイルポインタを引数として受け取ります。ファイルポインタに関連付けられたファイルは、fclose関数によって閉じられます。ファイルを閉じることに成功した場合は0を返し、ファイルを閉じる際にエラーが発生した場合はEOF(ファイルの終端)を返します。

ファイルを閉じた後は、同じファイル ポインターを他のファイルでも使用できます。

「C」プログラミングでは、プログラムが終了するとファイルは自動的に閉じられます。 fclose 関数を記述してファイルを手動で閉じることは、良いプログラミング方法です。

ファイルへの書き込み

C では、ファイルに書き込むときに、改行文字 '\n' を明示的に追加する必要があります。

stdio ライブラリは、ファイルに書き込むために必要な関数を提供します。

  • fputc(char, file_pointer): file_pointerが指すファイルに文字を書き込みます。
  • fputs(str, file_pointer): file_pointer が指すファイルに文字列を書き込みます。
  • fprintf(file_pointer, str, variable_lists): file_pointer が指すファイルに文字列を出力します。文字列には、オプションで書式指定子と変数リスト variable_lists を含めることができます。

以下のプログラムは、ファイルへの書き込みを実行する方法を示しています。

fputc() 関数:

#include <stdio.h>
int main() {
        int i;
        FILE * fptr;
        char fn[50];
        char str[] = "Guru99 Rocks\n";
        fptr = fopen("fputc_test.txt", "w"); // "w" defines "writing mode"
        for (i = 0; str[i] != '\n'; i++) {
            /* write to file using fputc() function */
            fputc(str[i], fptr);
        }
        fclose(fptr);
        return 0;
    }

出力:

fputc() 関数の出力(C言語)

上記のプログラムは、fputc_test.txt ファイルに1文字ずつ書き込み、改行記号「\n」に到達するまで続けます。改行記号「\n」は、文が正常に書き込まれたことを示します。この処理は、配列の各文字を取り出し、ファイルに書き込むというものです。

fputc_test.txt ファイルの内容は C 言語で記述されています

  1. 上記のプログラムでは、fputc_test.txt というファイルを作成して書き込みモードで開き、ファイルに書き込まれる文字列を宣言しました。
  2. for ループを使用して文字ごとの書き込み操作を実行し、「\n」文字が検出されるまで各文字をファイルに格納し、その後 fclose 関数を使用してファイルを閉じます。

fputs() 関数:

#include <stdio.h>
int main() {
        FILE * fp;
        fp = fopen("fputs_test.txt", "w+");
        fputs("This is Guru99 Tutorial on fputs,", fp);
        fputs("We don't need to use for loop\n", fp);
        fputs("Easier than fputc function\n", fp);
        fclose(fp);
        return (0);
    }

出力:

C言語におけるfputs()関数の出力

C言語におけるfputs_test.txtファイルの内容

  1. 上記のプログラムでは、fputs_test.txt というファイルを作成し、書き込みモードで開きました。
  2. fputs() 関数を使用して 3 つの異なる文字列を書き込む書き込み操作を実行した後
  3. 次に、fclose 関数を使用してファイルを閉じます。

fprintf()関数:

#include <stdio.h>
    int main() {
        FILE *fptr;
        fptr = fopen("fprintf_test.txt", "w"); // "w" defines "writing mode"
        /* write to file */
        fprintf(fptr, "Learning C with Guru99\n");
        fclose(fptr);
        return 0;
    }

出力:

fprintf() 関数の出力(C言語)

C言語におけるfprintf_test.txtファイルの内容

  1. 上記のプログラムでは、fprintf_test.txt というファイルを作成し、書き込みモードで開きました。
  2. fprintf() 関数を使用して文字列を書き込む書き込み操作を実行した後、fclose 関数を使用してファイルが閉じられます。

ファイルからのデータの読み取り

ファイルからのデータの読み取り専用の XNUMX つの異なる関数があります。

  • fgetc(file_pointer): ファイルポインタが指すファイルから次の文字を返します。ファイルの終端に達すると、EOFが返されます。
  • fgets(buffer, n, file_pointer): ファイルから n-1 文字を読み込み、NULL 文字 '\0' を最後の文字として追加した文字列をバッファに格納します。
  • fscanf(file_pointer, conversion_specifiers, variable_adresses): データの解析に使用されます。ファイルから文字を読み込み、変換指定子を使用して入力を変数ポインタのリスト variable_adresses に割り当てます。scanf と同様に、fscanf はスペースまたは改行文字に遭遇すると文字列の読み込みを停止することに注意してください。

次のプログラムは、それぞれ fgets()、fscanf()、fgetc() 関数を使用して fputs_test.txt ファイルから読み取る方法を示しています。

#include <stdio.h>
int main() {
        FILE * file_pointer;
        char buffer[30], c;

        file_pointer = fopen("fprintf_test.txt", "r");
        printf("----read a line----\n");
        fgets(buffer, 50, file_pointer);
        printf("%s\n", buffer);

        printf("----read and parse data----\n");
        file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
        char str1[10], str2[2], str3[20], str4[2];
        fscanf(file_pointer, "%s %s %s %s", str1, str2, str3, str4);
        printf("Read String1 |%s|\n", str1);
        printf("Read String2 |%s|\n", str2);
        printf("Read String3 |%s|\n", str3);
        printf("Read String4 |%s|\n", str4);

        printf("----read the entire file----\n");

        file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
        while ((c = getc(file_pointer)) != EOF) printf("%c", c);

        fclose(file_pointer);
        return 0;
    }

結果:

----read a line----
Learning C with Guru99

----read and parse data----
Read String1 |Learning|
Read String2 |C|
Read String3 |with|
Read String4 |Guru99|
----read the entire file----
Learning C with Guru99

C言語でファイルからデータを読み込む

  1. 上記のプログラムでは、以前に fprintf() 関数を使用して作成された「fprintf_test.txt」というファイルを開いており、そのファイルには「Learning C with Guru99 行の文字列です。これを 1 行ずつ読み込む fgets() 関数を使用して読み込みます。バッファサイズは、行全体を処理できる十分な大きさである必要があります。
  2. ファイルを開き直してポインターファイルの先頭を指すようにリセットします。各単語を個別に処理するために、さまざまな文字列変数を作成します。変数を出力してその内容を確認します。fscanf() は主に、tracファイルからデータを解析する。
  3. ファイルを再度開き、ポインタ ファイルをファイルの先頭を指すようにリセットします。 EOF ステートメントが検出されるまで、getc() 関数を使用してデータをファイルから XNUMX 文字ずつ読み取り、出力します。
  4. さまざまなバリアントを使用してファイルの読み取り操作を実行した後、fclose 関数を使用してファイルを再度閉じました。

getc および putc を使用した対話型ファイルの読み取りおよび書き込み

これらは最も単純なファイル操作です。 Getc は get character の略で、 putc は put character の略です。 これら 2 つの関数は、一度に 1 つの文字のみを処理するために使用されます。

次のプログラムは、「C」プログラミングにおけるファイル処理関数を示しています。

#include <stdio.h>
int main() {
        FILE * fp;
        char c;
        printf("File Handling\n");
        //open a file
        fp = fopen("demo.txt", "w");
        //writing operation
        while ((c = getchar()) != EOF) {
            putc(c, fp);
        }
        //close file
        fclose(fp);
        printf("Data Entered:\n");
        //reading
        fp = fopen("demo.txt", "r");
        while ((c = getc(fp)) != EOF) {
            printf("%c", c);
        }
        fclose(fp);
        return 0;
    }

出力:

C言語での対話型ファイル読み書き出力

getcとputcによるC言語でのファイル処理出力

  1. 上記のプログラムでは、demo というファイルを作成し、書き込みモードで開きました。
  2. 書き込み操作が実行された後、ファイルは fclose 関数を使用して閉じられます。
  3. 再び、読み取りモードでデータを含むファイルを開きました。EOF が見つかるまで while ループが実行されます。ファイルの終わりが見つかると、操作は終了し、printf 関数を使用してデータが表示されます。
  4. 読み取り操作を実行した後、ファイルは fclose 関数を使用して再度閉じられます。

よくあるご質問

テキストモードでは、改行文字はオペレーティングシステムに合わせて変換されますが、「rb」または「wb」で開くバイナリモードでは、バイト列がそのまま書き込まれます。画像、音声、または正確なバイト配列を保持する必要があるデータには、バイナリモードを使用してください。

fopen関数は、ファイルが見つからない、アクセス権限がない、ディスクがいっぱいなど、ファイルを開けない場合にNULLを返します。読み書きを行う前に、必ず返されたポインタをNULLと比較してください。そうしないと、プログラムは無効なポインタを使用し、通常はクラッシュします。

書き込みモード「w」は、既存のファイルを切り詰めて書き込み前に内容を消去し、ファイルが存在しない場合は新規作成します。追記モード「a」は、既存のデータを保持したまま末尾に新しい内容を追加するため、既に保存されているデータは失われません。

fseek は、ファイルポインタを SEEK_SET、SEEK_CUR、または SEEK_END から計測したバイトオフセットの位置に移動します。ftell はポインタの現在のバイト位置を返し、rewind はポインタをファイルの先頭に戻します。これらを組み合わせることで、シーケンシャル読み取りではなくランダムアクセスが可能になります。

fgetsが1行全体を読み込むと、停止します。ping 改行またはn-1文字の後に処理が行われるため、バッファサイズが尊重されます。fscanfはフォーマットされたスペース区切りのトークンを読み取りますが、短い配列ではオーバーフローする可能性があります。行全体を安全に読み込むには、fgetsの方が適しています。

EOFは、ファイルの終わりを示す定数(通常は-1)です。getc、fgetc、fscanfなどの読み取り関数は、データがなくなるとEOFを返します。そのため、ループ処理では、読み取りを停止するために結果をEOFと比較します。

はい。AIコーディングアシスタントは、平易な言語のプロンプトからfopen、fprintf、fgetsルーチンを生成し、各ファイルモードを説明し、NULLチェックの欠落や未クローズのファイルなどのバグを検出できます。AIが提案したコードを信頼する前に、必ずコンパイルしてテストしてください。

GitHubコパイロット C言語のファイル処理コードを生成するツールで、短いコメントや関数名からfopen、fputs、fscanfの完全なブロックを提案します。多くの場合、対応するfclose呼び出しとエラーチェックも追加されますが、生成されたロジックは必ず確認してください。