最初のバグ:入力ファイルを2回開いています。 2番目のオープン要求(open
メンバーへの直接の呼び出し)の動作については、C++標準パー:
C++ 11§27.9.1.9 [ifstream.members/3]
void open(const char* s, ios_base::openmode mode = ios_base::in);
効果:電話rdbuf()->open(s, mode | ios_base::in)
。その関数 がnullポインタを返さない場合、clear()を呼び出すと、は、 setstate(failbit)(これはios_base :: failure(27.5.5.4)をスローする可能性があります)を呼び出します。
したがって、質問は、rdbuf()->open(...)
は何ですか?まあ、std::ifstream
は、それが標準ごとに、再びバッファリングだ、とのためにfilebuf
を使用しています。
C++ 11§27.9.1.4[filebuf.members/2]
basic_filebuf<charT,traits>* open(const char* s, ios_base::openmode mode);
効果:is_open()
!= falseの場合、NULLポインタを返します。それ以外の場合は、必要に応じてfilebufを初期化します。 ...
つまり、ダブルオープンはストリームをフェイル状態にしています。つまり、すべてのデータ関連操作がその時点から完全に失敗することになります。
第2のバグ:ループ条件式での.eofの不適切な使用。最初のバグを修正したら、これを実行します。これが正しく行われていない理由は、私がここで説明できるよりもはるかに優れた次の質問で説明されています。
Why is iostream::eof inside a loop condition considered wrong?
ストリームのだけではなく、EOF状態、あなたのIO操作を確認し、言えば十分。その習慣に乗り、それに固執する。両方の固定
、あなたのコードは、文字通りに低減することができ、単にこの:あなたは、より堅牢なコードを撮影している場合は明らかに
#include <iostream>
#include <fstream>
#include <string>
int main()
{
std::ifstream inputFile("testfile1.txt");
std::string str;
while (std::getline(inputFile, str))
std::cout << str << std::endl;
}
は、おそらくそこに扱ういくつかのエラーを実行したい、何かのように:
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
int main()
{
std::ifstream inputFile("testfile1.txt");
if (!inputFile)
{
std::cerr << "Failed to open file\n";
return EXIT_FAILURE;
}
std::string str;
while (std::getline(inputFile, str))
std::cout << str << std::endl;
}
関連性のないファイルを2回開いたことがありますか? – WhozCraig
いいえ、それは非常に関連しています。同じファイルを2回開くことはここのバグです。 2番目の 'open()'は失敗し、 'fail'ビットをファイルストリームに設定します。ここでの2番目のバグは人気のある[while eof bug](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong)です。 –
@SamVarshavchik明らかに、コードは数分前にループ状態のロジックが現状の反対のポジションだったので、コードが変形しています。 Go figure。 – WhozCraig