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

C言語のfopen()関数:書き込みモードで既存ファイルを開いたときの挙動と対処法

C言語の fopen() 関数は、指定したファイルを開くために使用される標準ライブラリ関数です。本記事では、書き込みモードで既存のファイルを開いた場合にどのような挙動になるのか、サンプルコードと実行結果を交えながらわかりやすく解説します。

fopen() の基本構文

FILE *fopen(filename, mode)

fopen() で使用できる主なオープンモードは次の6種類です。

  • 'r' … 読み取り専用モード
  • 'w' … 書き込みモード(既存内容は消去)
  • 'a' … 追記(アペンド)モード
  • 'r+' … 読み書き両用モード
  • 'w+' … 読み書き両用モード(既存内容は消去)
  • 'a+' … 読み取り+追記モード

書き込みモードで既存ファイルを開いた場合の挙動

書き込みモード('w' / 'w+')でファイルを開いた場合の動作は、対象ファイルの有無によって次のように変わります。

  • カレントディレクトリにファイルが存在しない場合 … 新しい空のファイルが自動的に作成されます。
  • カレントディレクトリにファイルが存在する場合 … 既存の内容はすべて削除され、空の状態から書き込みが始まります。

サンプルコード:'w' モードでの書き込み

#include <stdio.h>
#include <stdlib.h>

int main(){

    FILE *opFile = fopen("test.txt", "w");
    if (opFile == NULL){

        puts("Couldn't open file");
        exit(0);
    }
    else{

        fputs("includehelp", opFile);
        puts("Write operation successful");
        fclose(opFile);
    }
    return 0;
}

実行結果

Write operation successful

書き込み前のファイル内容:C programming language

書き込み後のファイル内容:includehelp

ご覧のとおり、'w' モードでの書き込み自体は正常に行われますが、その一方で、書き込み前にファイル内に存在していたデータはすべて消去されてしまいます。この問題を回避するため、C言語ではプログラムの要件に応じて使い分けられる2つのモードが用意されています。

  • 'a'(追記)モード … ファイル内の既存データの末尾に、新しいデータを追加して書き込みます。
  • 'wx' モード … 対象ファイルがすでに存在する場合には NULL を返し、オープンに失敗します(誤って上書き・消去することを防げます)。

サンプルコード:'a' モードでの追記

#include <stdio.h>
#include <stdlib.h>

int main(){

    FILE *opFile = fopen("test.txt", "a");
    if (opFile == NULL){

        puts("Couldn't open file");
        exit(0);
    }
    else{

        fputs("includehelp", opFile);
        puts("Write operation successful");
        fclose(opFile);
    }
    return 0;
}

実行結果

Write operation successful

追記前のファイル内容:C programming language

追記後のファイル内容:C programming language includehelp

'a' モードを使用すれば、既存の内容を保持したまま、ファイルの末尾へ新しいデータを安全に追加できます。

サンプルコード:'wx' モードでの書き込み

#include <stdio.h>
#include <stdlib.h>

int main(){

    FILE *opFile = fopen("test.txt", "wx");
    if (opFile == NULL){

        puts("Couldn't open file");
        exit(0);
    }
    else{

        fputs("includehelp", opFile);
        puts("Write operation successful");
        fclose(opFile);
    }
    return 0;
}

実行結果

Write operation successful

'wx' モードは、同名のファイルが存在しない場合にのみ新規作成して書き込みを行います。もし同じ名前のファイルがすでに存在していれば、fopen() は NULL を返すため、上記のコードでは「Couldn't open file」と表示され、既存ファイルが保護されます。

まとめ

書き込みモードでファイルを扱う際は、用途に応じたモード選択が重要です。既存内容を消去して新しく書き込むなら 'w'、既存内容を残して末尾に追記したいなら 'a'、既存ファイルの誤上書きを防ぎたいなら 'wx' を使い分けましょう。

  1. Word・ExcelファイルをPDFに変換する簡単な方法【保存手順を解説】

    はじめにMS WordやMS Excelで作成した既存のファイルをPDF形式に変換するのは難しいと感じている方は少なくありません。そのため、変換専用のウェブサイトを利用する人も多いようです。しかし、実はわざわざ外部サイトを使う必要はありません。WordにもExcelにも、アプリケーション自体に「PDFとして保存」する機能が標準で搭載されているからです。筆者も学生時代にWordからPDFへの変換作業を頻繁に行っていましたが、この機能のおかげで作業が格段に楽になりました。ぜひ参考にしてください。Word文書をPDFとして保存する方法まず、PDF形式に変換したい文書を開きます。ここではMS Word

  2. NTFS for Mac 無料ツール活用ガイド:MacでNTFSドライブに書き込む方法

    ディスクを使って複数のコンピューター間でファイルをやり取りする際、多くのユーザーが直面するのがディスクのフォーマット形式に起因するトラブルです。こうしたファイル互換性の問題は、NTFS for Mac の無料ツールを活用することで解決できます。 macOS環境で外付けディスクを接続すると、中身を読み取ることはできても、書き込みやファイルの保存ができない——そんな制限に悩まされた経験はありませんか?これは、使用しているディスクが以前Windows OSでフォーマットされていた場合に発生する、典型的なクロスプラットフォーム互換性の問題です。 この問題を正しく理解するには、まず「ファイルシステム」に