2016-07-30 23 views
0

私はこのifStreamを持っていて、それはファイルから問題なく読んでいます。私は読んでいるアイテムのタイプをチェックするために1行を読みました。そして、ストリームをもう少し読む別のクラスに渡した後、このクラスに到達するとこの例外がスローされます。場所0x00000014を読み取るアクセス違反。 ここに、このエラーを示すコードがあります。アクセス違反の読み取り場所は0x00000014です。ストリームを使用する

void Author::readData(ifstream & stream1) 
{ 
    string line = ""; 
    getline(stream1, name); //The error happens here 
    if (stream1.fail() && stream1.eof()) 
    { 
     throw Error(-1); 
    } 
    else if (stream1.fail() && !(stream1.eof())) 
    { 
     throw Error(0); 
    } 
    getline(stream1, address); 
    if (stream1.fail() && stream1.eof()) 
    { 
     throw Error(-1); 
    } 
    else if (stream1.fail() && !(stream1.eof())) 
    { 
     throw Error(0); 
    } 
} 

void Book::readData(ifstream & stream1) 
{ 

    (*theAuthor).readData(stream1); //This is where the function is called. Let me check to see if It is even initialized here. 
    if (stream1.fail() && stream1.eof()) 
    { 
     throw Error(-1); 
    } 
    else if (stream1.fail() && !(stream1.eof())) 
    { 
     throw Error(0); 
    } 
    getline(stream1, title); 
    if (stream1.fail() && stream1.eof()) 
    { 
     throw Error(-1); 
    } 
    else if (stream1.fail() && !(stream1.eof())) 
    { 
     throw Error(0); 
    } 

私は多くの異なるウェブサイト上で研究を行っているが、私ははifstreamは、この例外がスローされた理由を説明そのいずれかを見つけるように見える傾けます。助けてください。

編集:もっと役立つことを期待してコードを追加しました。

+1

ファイルは正常に開かれましたか? – Rakete1111

+0

名前は何ですか? 'アドレス'とは何ですか?あなたは['std :: getline'](http://en.cppreference.com/w/cpp/string/basic_string/getline)と呼んでいますか? –

+0

はい。この関数に渡す前に、1行を読み込むために使用されていました。 – Mindstormer

答えて

1

示されたコードに問題はありません。

あなたが読んだWebサイトでは、C++プログラムが特定の行でクラッシュしたとしても、バグがどこにあるのか分かりません。私は簡単に、strcpy()が配列の最後を過ぎてスタックを破壊し、一連の作業を行い、関数から戻ろうとしたときにクラッシュするという最小の例を考え出すことができます。 C++のreturnステートメントには何も問題はありませんが、コードはその時点でクラッシュします。

getline()コールには何も問題はありません。

プログラミングエラーまたはバグにより、通常はメモリが破壊されますが、メモリ全体をストムした後、コードはすぐに使用することはできませんが、途中で進行します。後でいくつかのポインタで、プログラムは元に戻り、そのデータ構造を使用しようとし、ガベージに遭遇し、クラッシュします。

最も可能性の高い説明は、以前に起こったバグが、std::ifstream、および/または名前std::stringの全面に落書きしてしまったことです。さて、getline()をストリームからこの文字列に読み込むと、コードが爆発します。または、おそらく、何かがこのAuthorクラスのインスタンスへのポインタを台無しにしました。このクラスメソッドを実行しようとしました。 nameクラスのメンバーは明らかに完全な迷惑メールなので、コードが爆発します。もちろん、このバグはここにはないでしょうが、このAuthorクラスへのポインタが壊れてしまった場所であれば、どこでもかまいません。

minimum, complete, and verifiable exampleを投稿すると誰でもコンパイル、実行、再現できるバグがあります(「最小」要件に注意してください。コード全体を投稿する)。

あなたのバグを探して、残りのプログラム全体を調査する必要があります。 C++へようこそ。

+0

ありがとうございます。あなたはそれを修正する方法に完全に答えていませんでしたが。私は他の誰かから助けを得ました。あなたの答えはそれを解決するのに非常に役立ちました。 – Mindstormer

関連する問題