【C/C++】 streamクラスのeofメンバ

以下の記事でstreamクラスのeofの扱いが難しいという記事を書いたんやけど、まぁこれやったらと許容できる方法を考えたので載せておこう。

【C/C++】ifstreamのeofメンバ関数(違和感のある挙動)

ちなみに以前はifstreamについて書いたんやけど、調べてみるとstream系のeofは全て同じ実装みたい。
つまり、実際に最終要素にアクセスした後でないと、正確なeofを検出できないと。

そこで、以下のようにすると、うまく動きます。
ん〜、読み出し部分が2行あって気持ち悪いけど、一応これやったらちゃんと対応できてると思うんよね。

istringstream s(buff);
string line;

s >> line;                <– ミソ
while( !s.eof() ) {
    〜何らかの処理〜
    s >> line;
}

単純にwhileループをeofメンバで終了判定するのやけど、その時にwhile文の直前に一回読み出しを行ってしまおうと。

要素数が0の場合:  while文に入らず終了(処理されない)
要素数が1の場合:  while文に入り処理が1回実行。次のループ条件が偽になりループから抜ける。
要素数が2の場合:  上記の繰り返し

という事で、うまく行きそうですな。
ん〜、なるほど。こういう思想で設計されているんやね。

Author: kan
初めてプログラムらしきものを作ったのは幼稚園の時。それから約40年経ち、現在はデジタル回路設計から信号処理、機械学習まで幅広い経験を活かしてシステムアーキテクトとして活動中。超並列処理、デジタル回路とソフトウェアのバランス設計が得意分野。 Linux/Mac/Windows使い。 C/C++を主要言語として、Unity、Qtなどのフレームワーク興味あり。UI/UXデザイン、STL拡張など。 音声処理、画像処理、技術コンサルは仕事でも請け負います。 一般ソフトウェア開発プロセス、医療機器ソフトウェア開発プロセス作成も進行中。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください