0

ファイルから名前と投票数を読み取るプログラムを作成しようとしています。ただし、char配列をファイルから正しく読み取ることができません。

void Output(char candidateLastName[][10], long votesRecieved[])
    {
         ifstream Electionr("Election.dat");
         int loop = 0;

         cout << left << setw(10) << "Candidate" << setw(5) << "Votes" << endl;

         Electionr >> candidateLastName[0][10];
         Electionr >> votesRecieved[0];

         cout << setw(10) << candidateLastName[0] << setw(5)
              << votesRecieved[0] << endl;

         for(int loop = 1; loop < 5; loop++)
         {
                 Electionr >> candidateLastName[0][10];
                 Electionr >> votesRecieved[loop];

                 cout << setw(10) << candidateLastName << setw(5)
                      << votesRecieved[loop] << endl;
         }

         Electionr.close();
    }

ファイルからの数字は正しく読み取れますが、文字は読み取れません。

4

3 に答える 3

1
Electionr >> candidateLastName[0][10];

これは一文字読みです。間違った場所 (インデックス 1 の文字列の最初の文字) に読み込まれていることをしばらく無視してください...次のようなことをしたいのではないかと思います:

Electionr >> candidateLastName[0];

また、配列にインデックスを付けるloop代わりに、ループで変数を使用したいと思います。0その場合、ループをゼロから開始して、そのコードの複製を避けなかったのはなぜですか?

for(int loop = 0; loop < 5; loop++)
{
    memset( &candidateLastName[loop], 0, 10 );

    Electionr >> candidateLastName[loop];
    Electionr >> votesRecieved[loop];

    cout << setw(10) << candidateLastName[loop] << setw(5)
         << votesRecieved[loop] << endl;
}

cout(上記の呼び出しにもマイナーな修正を加えました)

文字列を明示的に null で終了する必要がある場合があることに注意してください (修正したループでそれを強制しましたが、たまたま 9 文字以下を読み取った場合のみです。そうしないと、オーバーフローして問題が発生します)。>>演算子で文字配列を読み取るときにこれが処理されるかどうかはわかりません。私はこのようなもののためにそれをすることはありません。std::string代わりに使っています。

于 2012-08-13T04:53:28.220 に答える
0

最初の読み取りは次のとおりです。

         Electionr >> candidateLastName[0];

ループ内では、次のことが必要です。

             Electionr >> candidateLastName[loop];

ただし、各名前の長さは最大で 9 文字 (さらに null 終端用に 1 文字) であると想定しています。

名前の配列と の配列を作成する方が安全ですstd::string

void Output(std::string candidateLastName[], long votesRecieved[])
于 2012-08-13T04:45:57.460 に答える
0

まず、配列に範囲外のインデックスがあります。また、常に最初の要素に書き込みます。また、そのような生の配列を使用しないでください。固定サイズの配列を使用する場合は、少なくとも std::array を使用してください。ただし、この場合は std::string が最も適切です。

とにかく、あなたが実際に何を望んでいるかを伝えるのは難しいですが、コードを書き直す方法についての私の最善の推測は次のとおりです。

std::map<std::string, unsigned long> Output()
{
    std::map<std::string, unsigned long> data;
     ifstream Electionr("Election.dat");

     cout << left << setw(10) << "Candidate" << setw(5) << "Votes" << endl;

     while(Electionr.good()){
        std::string name;
        unsigned long votes = 0;

        getline(Electionr, name, ' ');
        Electionr >> votes;

        data[name] = votes;

        cout << setw(10) << name << setw(5)
          << votes << endl;
     }

     return data;
} 
于 2012-08-13T04:43:54.957 に答える