2010-12-10 9 views
1

コンソールから行を読み込み、ユーザーが空白行を入力するまでそれらをコンテナに入れたいとします。私は空の行が私のコンテナに終わってしまわないようにしたい。ループ条件の一部、割り当てバージョンとして読まユーザーが空白行を入力するまでの読み取り

a)のループ

から休憩
std::vector<std::string> container; 
for (; ;) 
{ 
    std::string line = get_input(); 
    if (line.empty()) break; 
    container.push_back(line); 
} 

b)はループの前に読んで

std::vector<std::string> container; 
std::string line = get_input(); 
while (!line.empty()) 
{ 
    container.push_back(line); 
    line = get_input(); 
} 

ループ内C):私は、5つの異なる解決策を考えることができます

std::vector<std::string> container; 
std::string line; 
while (!(line = get_input()).empty()) 
{ 
    container.push_back(line); 
} 

d)ループ条件の一部として、シーケンスバージョン

std::vector<std::string> container; 
std::string line; 
while (line = get_input(), !line.empty()) 
{ 
    container.push_back(line); 
} 

e)に、あまりにも多くを読んだから、ループの後

std::vector<std::string> container; 
std::string line; 
do 
{ 
    line = get_input(); 
    container.push_back(line); 
} 
while (!line.empty()); 
container.pop_back(); 

それを削除し、その解決策は、あなたが好む、なぜでしょうか?何が初心者のために理解するのが最も簡単でしょうか?

答えて

2

(a)が好ましい。シンプルで、とても自然に読める。

(b)入力を取得する行を繰り返します。

(c)と(d)はどちらも、初心者(具体的には、forステートメント内のコンマではないコンマまたは条件内の割り当て)を使用します。私はおそらく(C)以上(D)を好むだろう。

(e)は非効率的です。その最後のpush_backが再割り当てを行った場合はどうなりますか?しかしこれは予期しないかもしれない副作用があり

class non_blank { 
    std::string data; 

    friend operator>>(std::istream &is, non_blank &n) { 
     std::string temp; 

     std::getline(is, temp); 

     // I'm not writing this from home, so I'm going from memory. 
     // The following line is probably a little wrong. 
     is.setbit(std::ios::fail, temp.length()!=0); 
     return is; 
    } 
    operator std::string() { return data; } 
}; 

non_blank line; 
while (infile >> line) 
    container.push_back(line); 

0

あなたはおそらく私から期待したように、私はプロキシをお勧めしたい、それが非空白行を読み取るために期待しているので、それを空白行は失敗した変換とみなされます。これは後でストリームから多くのデータを読み込むことを意味し、ストリームの失敗ビットをクリアする必要があります。ストリームのフェイルビットを設定することで動作するため、std::copyを使用して入力を読み取ることができ、変換が失敗したときに停止します。

+0

は彼が何のためにWAY行き過ぎすなわち達成しようとしている。 –

+0

私はそれがあなたがそれをやる必要があるかどうかにかかっていると思います。もしあなたが一度だけ使っているのであれば、それは過度のものだと主張できるところがわかります。しかし、あなたがそれを正当化するために非常に頻繁に使用しなければならないとは思わないでください。 –

2

私は実際にメソッド「d」を使用したい:行われている最高のものを、私の意見では

-Itショー:最初のデータを読み、それが「良い」データでない場合(空行)読み取りを停止しますデータ。

Mtheod "a"は条件チェックを非表示にします&それはもっと難しいです(私の謙虚な意見では)ループを「停止する」条件を参照してください。

0

(D)への変更は、それがより効率的になり、あなたがより良いやろうとしているものは以下。

std::vector<std::string> container; 
std::string line; 
do 
{ 
    line = get_input(); 
    if (!line.empty()) 
    { 
     container.push_back(line); 
    } 
    else 
    { 
     break; 
    } 
} 
while (true); 
関連する問題