2017-12-22 16 views
0

ファイルを読むための次のコードは、即座に作業して完了しました。なぜこの行は無限ループですか?

auto copy = [&](const FileName &src, std::ofstream &dst) 
{ 
    std::ifstream r(src); 
    std::string line; 
    while (std::getline(r, line)) { dst << line << std::endl; } 
}; 

srcdstが働いて出力ストリームで、小さなファイルです。ループを次のように変更した場合:

while (std::getline(std::ifstream(src), line)) { dst << line << std::endl; } 

私のプログラムはwhileループで永遠に実行されていました。なぜ無限ループですか?私はXcode C++ 11を使用しています。

+0

出力することができます。私にとっては、常に最初の行だけを読んでいるように見えます。なぜなら、常に新しいifstreamを作成するように見えるので、ポインタ/イテレータは保持されず、次の行に設定されないからです。 – icbytes

+0

これは質問には触れませんが、実際には 'std :: endl'が行う余分なものが必要ですか? '' \ n ''は行を終わらせます。 –

答えて

6

whileループでstd::getlineを呼び出すたびに、新しいstd::ifstream(src)が初期化され、常にファイルの最初の行が取得されるためです。

2
while (std::getline(std::ifstream(src), line)) { dst << line << std::endl; } 

すべてのループ実行でストリームを初期化するためです。

1

これは、関数getline(stream, string)がストリームの最初の行を受け取るために発生します。 ifstream(src)を実行すると、新しいストリームが作成され、最初から開始されます。

希望します。

関連する問題