C言語で自分自身のソースコードを出力するプログラムの書き方
この記事では、実行すると自分自身のソースコードをそのまま出力するCプログラムの作成方法を解説します。
基本的な考え方
自分自身のソースコードを表示するには、C言語のファイル操作機能を利用します。たとえば「code1.c」というファイルにコードを書いている場合、そのファイルを読み込みモードで開き、内容をすべて読み取って画面に出力すればよいのです。
ただし、ファイルを読み込みモードで開く前に、自分がコードを書いているファイル名を把握しておく必要があります。そこで便利なのがマクロ「__FILE__」です。このマクロはデフォルトで、現在のファイルのパスを文字列として返します。
マクロ「__FILE__」の使用例
#include<stdio.h>
int main() {
printf("%s", __FILE__);
}
上記のプログラムを実行すると、コードが書かれているファイルのパスが出力されます。つまり、__FILE__は、このマクロが記述されている現在のプログラムへのパスを含む文字列を返すのです。
したがって、このマクロをファイル操作と組み合わせて、コードが書かれている現在のファイルを読み込みモードで開くには、次のように記述します。
fopen(__FILE__, "r");
アルゴリズム
開始
ステップ1 → 関数 int main(void) 内で
文字型変数 c を宣言する
「__FILE__」を読み込みモードで FILE 型ポインタ「file」に開く
c が EOF(ファイル終端)でない限り do-while ループを繰り返す
c = fgetc(file) を代入
putchar(c) で1文字ずつ出力
ファイル「file」を閉じる
終了
サンプルコード
#include <stdio.h>
int main(void) {
// 自身のソースコードを出力する
char c;
// __FILE__ で現在のCプログラムファイルの
// 場所を取得する
FILE *file = fopen(__FILE__, "r");
do {
// ファイルの内容を1文字ずつ出力する
c = fgetc(file);
putchar(c);
}
while (c != EOF);
fclose(file);
return 0;
}
出力結果
#include <stdio.h>
int main(void) {
// 自身のソースコードを出力する
char c;
// __FILE__ で現在のCプログラムファイルの
// 場所を取得する
FILE *file = fopen(__FILE__, "r");
do {
// ファイルの内容を1文字ずつ出力する
c = fgetc(file);
putchar(c);
}
while (c != EOF);
fclose(file);
return 0;
}
このように、プログラムを実行すると、ソースファイルに書かれたコードがそのまま標準出力に表示されます。
補足:より安全な実装のために
実際の開発では、fopen の戻り値が NULL でないか(ファイルが正しく開けたかどうか)を必ず確認しましょう。また、この手法はコンパイル後もソースファイルが実行ファイルから参照できる場所に存在していることが前提となるため、配布環境では動作しない場合がある点に注意が必要です。
ちなみに、自分自身のソースコードを出力するプログラムは一般に「クワイン(Quine)」と呼ばれています。ファイル操作に頼らず、文字列操作だけで自己出力を実現する純粋なクワインの実装にも挑戦してみると、C言語の理解がさらに深まります。
-
「ファイルは有効な32ビットアプリケーションではありません」エラーの原因と対処法
プログラムを実行しようとした際に、そのファイルが破損していたり、そもそも存在していなかったりすると、Windowsはファイルを正しく実行できず、「ファイルは有効な32ビットアプリケーションではありません(File is not a valid 32-bit application)」というエラーが表示されることがあります。 このエラーは、実行ファイル(.exe)が有効な32ビットアプリケーションとして認識されていないことを意味します。一見深刻な問題に見えますが、心配は無用です。いくつかの対処法で解決できるケースがほとんどです。 主な原因としては、次のようなものが考えられます。 ダウンロード
-
【解決】「ファイルが別のプログラムで開かれています」エラーの直し方
「ファイルが別のプログラムで開かれています」エラーとはファイルに対して操作を実行しようとした際に、そのファイルが別のプログラムによってアクセスされていると、「ファイルが別のプログラムで開かれています」というエラーが表示され、タスクや操作を実行できなくなります。これはコンピューティングにおいて古くから存在する基本的な仕組みで、主にデータの不整合を防ぐために設けられています。しかし、実際にはどのアプリケーションもそのファイルを使用していないのにエラーが発生する場合、厄介な問題となります。ファイルがバックグラウンドの隠れたサービスによって使用されている可能性や、バグが原因で操作が妨げられている可能性