2016-11-06 20 views
0
#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 
int main() 
{ 
    //reading the text file 
    ifstream inputFile("testfile1.txt"); 
    inputFile.open("testfile1.txt"); 
    while(!inputFile.eof()) 
    //eof till end of file, reads the txt till end of file 
    { 
     string str; 
     getline(inputFile,str); 
     cout <<str<< endl; 

    } 
     inputFile.close(); 

    return 0; 
} 

//問題は、ファイルやその中の何かを読み取っていないことです。何もしないプログラムは終了コードで終了しました:0誰でもコードの間違いを確認できますかC++の.txtファイルからの読み込みでエラーが発生しました

+0

関連性のないファイルを2回開いたことがありますか? – WhozCraig

+2

いいえ、それは非常に関連しています。同じファイルを2回開くことはここのバグです。 2番目の 'open()'は失敗し、 'fail'ビットをファイルストリームに設定します。ここでの2番目のバグは人気のある[while eof bug](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong)です。 –

+0

@SamVarshavchik明らかに、コードは数分前にループ状態のロジックが現状の反対のポジションだったので、コードが変形しています。 Go figure。 – WhozCraig

答えて

-1

while文を翻訳してください: "inputFileはファイルの最後にあります" ..あなたはその否定をしたい。

+0

私は実際に(!inputfileを持っていた。 eof)でも、それでも何もしません。ファイルの読み込みに問題がありますか? – user45524

0

これは、このarticleに従ってファイルを読み取る正しい方法です! あなたのコードの問題は、あなたがIDEを使用しているようで、あなたが与えているパスを見つけることができないと思われるので、ファイルへの完全なパスを与えるようにしてください。それがあなたを助けることを願っています。

string line; 
ifstream f("/YOUPARTH/testfile1.txt"); 
if (!f.is_open()) 
    perror("error while opening file"); 
while(getline(f, line)) { 
    cout << line << endl; 
} 
if (f.bad()) 
    perror("error while reading file"); 
return 0; 
1

最初のバグ:入力ファイルを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; 
} 
関連する問題