C言語のコピープログラムの作り方|ファイルコピー処理の基本コードを初心者向けに解説

C言語関連

C言語の授業や課題でよく出題されるのが「ファイルのコピープログラム」です。入力ファイルを読み込み、別ファイルへ同じ内容を書き込む処理は、C言語のファイル操作を学ぶ基本問題として非常に有名です。この記事では、C言語でファイルコピーを行う基本ソースコードと、初心者がつまずきやすいポイントをわかりやすく整理します。

ファイルコピー問題とは?

ファイルコピー問題は、簡単に言うと「あるファイルの内容を別のファイルへそのまま複製する」プログラムです。

例えば、以下のような動きをします。

元ファイル コピー先
input.txt output.txt

input.txtの内容を読み込み、その内容をoutput.txtへ書き込みます。

基本的なコピープログラムのソースコード

以下は最も基本的なC言語のファイルコピープログラムです。

#include <stdio.h>int main() {    FILE *fp1, *fp2;    char ch;    fp1 = fopen("input.txt", "r");    fp2 = fopen("output.txt", "w");    if (fp1 == NULL || fp2 == NULL) {        printf("ファイルを開けません\n");        return 1;    }    while ((ch = fgetc(fp1)) != EOF) {        fputc(ch, fp2);    }    fclose(fp1);    fclose(fp2);    printf("コピー完了\n");    return 0;}

このコードは1文字ずつ読み込みながらコピーしています。

プログラムの流れを理解する

コピープログラムは大きく分けると以下の流れになります。

  1. ファイルを開く
  2. 文字を読み込む
  3. 別ファイルへ書き込む
  4. 最後まで繰り返す
  5. ファイルを閉じる

シンプルですが、C言語のファイル処理の基本がすべて含まれています。

fopenの意味

ファイルを開くにはfopenを使います。

fopen("input.txt", "r");

この”r”は「読み込みモード」です。

一方、書き込み側では以下を使用しています。

fopen("output.txt", "w");

“w”は「書き込みモード」を意味します。

モード 意味
r 読み込み
w 書き込み
a 追記

EOFとは何か?

ファイルコピーでよく出てくるのがEOFです。

while ((ch = fgetc(fp1)) != EOF)

EOFは「End Of File」の略で、ファイル終端を意味します。

つまり、「ファイルの最後まで読み込む」という処理になっています。

初心者がよく間違えるポイント

この問題では、以下のミスが非常に多いです。

  • fopenのモードミス
  • ファイル名間違い
  • fclose忘れ
  • EOF判定ミス
  • セミコロン忘れ

特にEOF判定部分は試験でも頻出です。

1行ずつコピーする方法もある

文字単位ではなく、1行ずつコピーする方法もあります。

char str[256];while (fgets(str, sizeof(str), fp1) != NULL) {    fputs(str, fp2);}

こちらはテキストファイル処理でよく使われます。

文字単位より高速で、コードも読みやすくなります。

コマンドライン引数を使う応用版

応用として、コピー元とコピー先を引数で指定する方法もあります。

copy input.txt output.txt

このタイプは実践的なプログラムとしてよく紹介されます。

ただし、初心者向け課題では固定ファイル名のケースが多いです。

なぜコピープログラムが重要なのか

この問題は単純に見えて、実はC言語の重要技術が多く含まれています。

  • ポインタ
  • ファイル操作
  • 繰り返し処理
  • EOF判定
  • 文字データ処理

そのため、大学や専門学校の授業でも定番課題として扱われます。

まとめ

C言語のコピープログラムは、ファイル処理の基礎を学ぶ代表的な問題です。

基本的には、fopenでファイルを開き、fgetcで読み込み、fputcで書き込み、EOFまで繰り返す流れになります。

最初は難しく感じるかもしれませんが、処理の流れを理解すると他のファイル操作問題にも応用できるようになります。まずはシンプルなコピー処理から慣れていくのがおすすめです。

コメント

タイトルとURLをコピーしました