2017-01-27 1 views
0

に読んで、最初のステップは、構造体配列にテキストファイルから情報をロードすることです。しかし、プログラムが範囲外のインスタンスに入っていると言って、読み取り/書き込みプロセス中にエラーメッセージが表示されます。だから私は、データベースストレージのためのプログラムを書いている構造体配列

while (!inFile.eof()) 
{ 
    getline(inFile, dataLine);    //saves the line of the file into a string 

    a[i].name = dataLine.substr(0, 17); // 18 
    a[i].author = dataLine.substr(19, 33); // 15 
    a[i].vol = dataLine.substr(35, 60); // 26 
    a[i].pub = dataLine.substr(62, 77); // 16 
    a[i].year = dataLine.substr(79, 82); // 4 
    a[i].price = dataLine.substr(84, 91); // 8 
    a[i].copies = dataLine.substr(93, 96); // 3 


    i++; //moves through the array after each line. 
    count++; //counts how many lines/items there are in the file entered for the program 
} 

私はこのセクションに問題を絞り込んだが、何が問題になるのか理解できないようだ。

terminate called after throwing an instance of 'std::out_of_range' 
what(): basic_string::substr: __pos (which is 19) > this->size() (which is 0) 
Aborted 

ここに私が得たエラーメッセージがあります。

+0

まず第一に、[**これは間違っている**:(!inFile.eof()) ''しばらく](https://stackoverflow.com/questions/5605125/why-is-iostreameof- loop-condition-considered-wrong)を使用している。それを修正してください。次に、問題を再現するために必要な入力を含めて、問題を再現する[最小限、**完全な検証可能な例](https://stackoverflow.com/help/mcve)を含めるように質問を更新します。 – WhozCraig

+0

@WhozCraigおそらくエラーの原因です。そのため、ループはファイルの最後に停止していません。 'getline()'は長さ0の文字列を返し、 'dataLine.substr(19、33)'はエラーを返します。 – Barmar

答えて

0

あなたが直面している具体的なエラーがdataLineの長さがゼロであり、あなたがサブしようとしているということです。例外は、ここで説明されていますhttp://www.cplusplus.com/reference/string/string/substr/

は、文字列の長さのために追加のチェックを行うと、この問題を解決するでしょう。

if (dataLine.size() >= 97) { 
    ... 
} 
+0

具体的には、これらのsubstr呼び出しのそれぞれは、 'dataLine.length()'が部分文字列要求の右端と少なくとも同じ幅であることを保証する必要があります。そうでない場合は無意味です。最低でも、 'dataLine.length()> = 97'を確認する必要があります。 – WhozCraig

関連する問題