複数のファイルを一度に作る

こういうのにとまどったためにプログラミングが嫌いになるのはよくない。ということで、研究室の同期に聞かれたことをパブリックに答える。

#include <stdio.h>

int main() {
	int i;
	char filename[20];
	FILE *fp;

	for (i = 0; i < 10; i++) {
		sprintf(filename, "test%03d.txt", i);
		fp = fopen(filename, "w");
		if (fp == NULL) { /* error handling */ }

		// do something
		// such as:
		fprintf(fp, "%d\n", i * i);

		fclose(fp);
	}
	return(0);
}

注釈

filename[]の宣言

sprintf()で予想される文字数から、この変数の大きさを検討する。このサイズが、sprintf()の結果 + 1 byte (NULL文字)よりも小さいと、バッファオーバーフローが起こってしまう。ただしあまり大きすぎるのはメモリの無駄で、また、OSによっては256 bytes以上をファイル名(パス)として受け付けないなどの制限があることに注意する。ここでは適当に20バイトを確保することにした。

ファイル名の決定
sprintf(filename, "test%03d.txt", i);

によって、ファイル名を決定する。このように書くとtest000.txt, test001.txt, ...のように連番で作られる。apple.txt, banana.txt, cherry.txt, ...のように数字と関係ないものにしたいときは、文字列の配列を別に定義して、それを添え字で参照する。なおバッファオーバーフローを危惧する場合は、sprintf()ではなくsnprintf()の使用を検討する。

個別ファイルの処理

fopen()でファイルを開く。なんらかの理由で開けなかったときは戻り値fpがNULLポインタなので、次のif文でエラーに対処する(ここでは略)。
その後は連番ファイルにいろいろ書き込んで、fclose()で閉じる。このコードではfpを再利用しているので、きちんと閉じないと恐ろしいことが起こるかもしれない。開けたら閉めるって大事だよ。