在c ++中从文件中读取和显示字符数组

时间:2012-08-13 04:30:26

标签: c++ arrays character

我正在尝试编写一个程序,其中从文件中读取名称和投票数。但是我无法从文件中正确读取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();
    }

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(); }

虽然文件中的数字读取正确,但字符不会。

3 个答案:

答案 0 :(得分: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电话进行了小修补)

请注意,您可能需要显式空终止字符串(我在修改后的循环中强制执行此操作,但仅当您碰巧读取9个字符或更少时 - 否则您将溢出并出现问题)。我不确定在使用>>运算符读取字符数组时是否处理了这个问题。我从来没有这样做过。我改为使用std::string

答案 1 :(得分: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;
} 

答案 2 :(得分:0)

您的第一次阅读应该是:

         Electionr >> candidateLastName[0];

在你的循环中,你想要:

             Electionr >> candidateLastName[loop];

但是,假设每个名称最多9个字符(加上一个用于空终止)。

使用std::string的名称数组和数组会更安全。

void Output(std::string candidateLastName[], long votesRecieved[])