C++ 有动态数组(通过std::vector)和foreach 循环(通过std::for_each()、range-based for loops 等)。
试试这样的:
#include <vector>
#include <string>
#include <fstream>
#include <limits>
struct candidate
{
std::string name;
double votes;
};
int main()
{
std::vector<candidate> candidates;
std::ifstream infile("votedata.txt");
int numberofCandidates;
if (infile >> numberofCandidates)
{
infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
for (int x = 0; x < numberofCandidates; x++)
{
candidate c;
if (!std::getline(infile, c.name)) break;
if (!(infile >> c.votes)) break;
infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
candidates.push_back(c);
}
}
// use candidates as needed...
return 0;
}
如果你真的想变得棘手,你可以让 STL 为你循环文件,通过使用 std::copy() 或 std::copy_n() 和 std::istream_iterator 和 std::back_inserter 作为输入/输出迭代器:
#include <vector>
#include <string>
#include <fstream>
#include <algorithm>
struct candidate
{
std::string name;
double votes;
};
std::istream& operator>>(std::istream &in, candidate &c)
{
if (std::getline(in, c.name))
{
if (in >> c.votes)
in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
return in;
}
int main()
{
std::vector<candidate> candidates;
std::ifstream infile("votedata.txt");
int numberofCandidates;
if (infile >> numberofCandidates)
{
infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
// using std::copy()...
// ignoring numberofCandidates, read until EOF...
std::copy(std::istream_iterator<candidate>(infile),
std::istream_iterator<candidate>(),
std::back_inserter(candidates));
// using std::copy_n()...
std::copy_n(std::istream_iterator<candidate>(infile),
numberofCandidates,
std::back_inserter(candidates));
}
// use candidates as needed...
return 0;
}
考虑到您还没有涵盖std::vector,您可能还没有涵盖STL算法,所以上面看起来更像是使用手动循环和2个固定数组而不是std::vector:
#include <string>
#include <fstream>
#include <limits>
const int cMaxCandidates = 20;
int main()
{
std::string candidateNames[cMaxCandidates];
double candidateVotes[cMaxCandidates];
int numberofCandidates = 0;
std::ifstream infile("votedata.txt");
int numberofCandidatesInFile;
if (infile >> numberofCandidatesInFile)
{
infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
for (int x = 0; (x < numberofCandidatesInFile) && (x < cMaxCandidates); x++)
{
if (!std::getline(infile, candidateNames[x])) break;
if (!(infile >> candidateVotes[x])) break;
infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
++numberofCandidates;
}
}
// use candidateNames[] and candidateVotes[] up to max
// numberofCandidates of elements as needed...
return 0;
}
或者,使用动态分配的数组:
#include <string>
#include <fstream>
#include <limits>
int main()
{
std::string *candidateNames = NULL;
double *candidateVotes = NULL;
int numberofCandidates = 0;
std::ifstream infile("votedata.txt");
int numberofCandidatesInFile;
if (infile >> numberofCandidatesInFile)
{
infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
candidateNames = new std::string[numberofCandidatesInFile];
candidateVotes = new double[numberofCandidatesInFile];
for (int x = 0; x < numberofCandidatesInFile; x++)
{
if (!std::getline(infile, candidateNames[x])) break;
if (!(infile >> candidateVotes[x])) break;
infile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
++numberofCandidates;
}
}
// use candidateNames[] and candidateVotes[] up to max
// numberofCandidates of elements as needed...
delete[] candidateNames;
delete[] candidateVotes;
return 0;
}