我正在尝试编写一个程序,其中从文件中读取名称和投票数。但是我无法从文件中正确读取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();
}
虽然文件中的数字读取正确,但字符不会。
答案 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[])