2015年6月21日日曜日

g++における、getline()の戻り値について

cのときからテキストファイルを読み込むときによく使っていたのがgetline()でした。

ssize_t getline(char** , size_t , FILE* )

1行ずつ読込、戻り値に読み込んだ文字数が返ってくるため、ファイルの最後までいくと読めないので、文字数0が返ってきました。それを使って、最後まで読んだかをチェックするのが普通でした。

while ( getline(line, 256, fp) !=0 )

こんな感じです。c++になるとifstreamで同じ関数があり、確か最初(20年くらい前)は同じ仕様だったと思います。ずっとそう思っていました…

Macのxcodeで既存のlinuxで作成したプログラムをコンパイルしようとすると、どうしてもこのgetline()でエラーがでて、ずっと悩んでいましたが今日やっと理由がわかりました。c++でのgetline()の戻り値はifstream自身でした。
つまり、読込に成功したら"true"、最後までいき失敗したら"false"を返すようになってました。
でもこれまでlinuxの方では、0とかNULLで比較していても何もいってこなかったんで気付きませんでしたが、本当は以下のようにチェックすべきでした。

while ( fp.getline(line, 256))

linuxの方は昔のcの実装がboolがなくて、unsigned intでやれ、という指定だったためそれとの互換性を考えていたようです。しかしmacは厳密にチェックするようになったため、エラーにしているようです。さて、既存の遺産をどうするか注意しないと。


0 件のコメント:

コメントを投稿