ログファイルの分割

ある大きなログファイルがあって、決まった書式の文字列で区切られているものを分割するプログラムを作った。ファイルを読んで分割して書き出すのはすぐにできたのだが、そのファイル名を区切りに書いてある番号付の文字列にするところでてこずった。

区切りの文字列は">> ABC-12.6"というような文字列で、数字は項目番号である。この文字列の先頭の記号とスペースを除いたもの+".log"をファイル名にしたかった。まずてこずったのは"ABC-12.6"を切り取ることである。Excelの関数ではmidとかを使って切り取った経験はあるのだが、どうもうまくいかない。結局、問題は文字列の末尾にCR+LFがついていたことが理由だった。その2文字もlengthに含まれていたのだ。

次の難所は、ある条件でファイル名に余計な文字列が付加されることである。たとえば、"ABC-10.15"の次に"ABC-11.1"が来たときに、"ABC-11.15"となってしまう。前の文字列より短い場合に、前の文字列の末尾が残ってしまうのである。

調べた結果、strncpy関数は、コピー先の文字列より長い文字列をコピーした場合は終端文字が付加されるが、コピー先より短い文字列をコピーすると、終端文字が付加されないことがわかった。そのため、strncpy関数を使用するさいには常に終端文字を付加することが推奨されているようである。