0

割り当てのために行っているコードに問題があります。私が行ってファイルをコンパイルすると、動作する場合と動作しない場合があります。プログラムの基本的な考え方は、ファイルからテキストの各行を読み取り、それを配列に格納することです (配列のサイズは 100 で、テキストは 100 行ある必要があります)。テキストの各文字列 (各行) は、独自の配列アドレスに格納する必要があります。すべての行が保存されると、プログラムは配列から各行を引き出し、それがどの行番号からのものであるかに注意します。Code::Blocks でコンパイルすると問題なく実行されますが、cygwin でコンパイルすると実行すると、「'std::bad_cast' のインスタンスをスローした後に呼び出されて終了します」というエラー メッセージが表示されます。 ): std::bad_cast が中止されました (コアがダンプされました)"

皆さんが私に与えることができるどんな助けも大歓迎です!

これまでに取得したコードは次のとおりです。

#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

int main()
{
string aFile[100];
ifstream nFile("TMA1Question4 Text.txt");
string nText;

    if (nFile)
    {
        for (int nLineCounter=1; nLineCounter <=100; getline(nFile, nText))
        {
            aFile [nLineCounter] = nText;
            nLineCounter++;
        }
    }

for (int nLineReader=1; nLineReader<=100; nLineReader++)
{
    cout << "Line" << nLineReader << ": " << aFile[nLineReader] << endl;
}

return 0;
}
4

2 に答える 2

1

まず、配列は 0 からインデックス付けされます。配列インデックスの範囲は 1 から 100 ではなく、0 から 99 です。forループは次のようになります。

for (int nLineReader=0; nLineReader<100; nLineReader++)

forループを卑劣な方法で使用しようとすることも問題です。は、各反復getlineにのみ呼び出されます。最初の反復では、空の文字列を配列に貼り付けています。次のように変更します。nText

for (int nLineCounter=0; nLineCounter<100; nLineCounter++)
{
    getline(nFile, nText);
    aFile [nLineCounter] = nText;
}

もちろん、これは、ファイルに 100 行あることが確実であるかどうかに依存します。ファイルから行を読み取るより安全な方法はgetline、ループの条件として使用することです。

int nLineCounter = 0;
while (getline(nFile, nText))
{
    aFile[nLineCounter] = nText;
    nLineCounter++;
}

ただし、標準のコンテナーを使用する場合 (そうするべきです)、ループなしでファイルから行を読み取ることができます。

于 2013-02-09T22:20:29.983 に答える
0

C および C++ でのインデックス作成は0 ベースであるため、カウンターを 0 から開始し、最大値より 1 少ない値に進みます。


std::vectorそうは言っても、生の配列の代わりに aを使用することを検討してください。push_backその後、 のメソッドを使用できますstd::vector。そうすれば、正確に 100 行だけでなく、任意の数の行をより簡単に保存できます。


現在のコードには他にもいくつかの問題がありますが、技術的な問題を修正すると、おそらくすべてを見つけて修正できるでしょう...;-)

于 2013-02-09T22:19:23.900 に答える