このブログを検索

2008/10/24

ファイルを特定の文字列で分割する


cygtls::handle_exceptions: Error while dumping state (probably corrupted stack)

ある簡単なCのプログラムを実行したときに表示されたエラーである。

サーチしても全然情報がなくて、試行錯誤の結果原因はわかった。恥ずかしいことだが、openしていないファイルに書き込もうとしたことが原因である。

しかし、私は釈然としない。たしかに私の初歩的なミスではあるが、その時にどうして上記のようなエラーが表示されるのか、と。何がprobably corrupted stackだよ、と。

作ったプログラムは、あるファイルを分割するものである。

分割条件は、">>"で始まり、"<<"で終わる。
ファイルを読んで、">>"が現れたら出力ファイルを開き、"<<"が現れるまで読み込んだ行を出力ファイルに書き込む。
そして、"<<"が現れたらファイルを閉じる、というループである。

私は、">>"が現れない場合を考慮していず、その場合は読み飛ばさなけれならないのにopenしていないファイルに出力していた。

とりあえず、出力ファイルのopen/close時にフラグをオン・オフして、フラグがONの時のみ書き込むようにした。

最初、フラグの名前を"WRITE"にしたらエラーが出た。予約語だなと思って"write_flg"としたら、またエラーが出た。これも予約語なのかなと"www"にしたらようやくコンパイルが通った。

もうひとつ懸案事項がある。

このプログラムでは、ある条件で現れるログ内の行の文字列をファイル名としている。その文字列の長さは不定であり、その文字列に拡張子".log"を連結している。

strncpy(s2,buf+3,strlen(buf)-4);
s2[strlen(buf)-4]='\0';
printf("%s\n",s2);
sprintf(s, "%s%s", s2, EXT);
outputfile = fopen(s, "w");

このとき、strncpyで文字列をコピーしているのだが、開始位置が3で、文字列長は3+1=4である。この+1とは、改行コードのLFである。

">> ABC-1.2"+(LF)

という文字列から、

"ABC-1.2.log"

という文字列を作りたいのである。

一応これでうまくいっているのだが、改行コードがCR+LFになると、だめだ。そのときは、-5にしないといけない。これをどちらでも対応できるように、つまりCR+LFなら5,LFなら4とする方法はあるのか?