我正在为我的C ++类做一个作业,并且在使用ifstream在while循环中将数据传递给向量时遇到了麻烦。
这就是我最终这样做的方法,它有效,但依赖于数据文件少于100个整数:
void Frequency()
{
ifstream frequency("test.dat");
if (! frequency)
{
cout << "**Error opening File**";
}
else
{
int data;
vector <int> numbers(101, 0);
while(frequency >> data)
{
numbers[data-1] += 1;
}
for(int i = 100; i >= 1; i--) //
{
if (numbers[i] != 0)
{
cout << setw(3) << i+1 <<": " << numbers[i] << endl;
}
}
}
}
以降序返回某些数字的频率。
这感觉更像是我打败它而不是编码,但是(虽然我的导师坚持说“这是简单的方法!”我不想轻松,我想要正确。我正在做像这样:
void Frequency()
{
ifstream frequency("test.dat");
if (! frequency)
{
cout << "**Error opening File**";
}
else
{
int size = 0;
int x; //actually a useless variable, only exists so the program can iterate to find the size
while (frequency >> x) //gives us the size of the data file
{
size++;
}
vector <int> numbers(size, 0);
int data;
int a = 0;
while (frequency >> data) //inputs the data into the vector
{
numbers[a] = data;
a++;
}
for (int a = 0; a < size; a++)
{
frequency >> numbers[a];
}
for(int i = 0; i < size; i++) //displays each subvector and it's value (for testing)
{
cout << "numbers[" << i << "]: " << numbers[i] << endl;
}
}
}
但是所有的向量都返回0.有人能看出为什么数据没有正确传递吗?
这是我传递的数据文件,仅供参考。
75 85 90 100
60 90 100 85
75 35 60 90
100 90 90 90
60 50 70 85
75 90 90 70
答案 0 :(得分:2)
由于您不知道文件中有多少不同的值,因此您有两个选项:resize
必要时使用向量,或使用map
。后者是解决这个问题的最简单方法:
std::map<unsigned, unsigned> numbers;
while(frequency >> data)
{
numbers[data]++;
}
如果您想再次遍历数字,可以使用您当前的方法。但是,这会导致其他条目添加到您的地图中(请查看std::map::operator[]
)。但是,您可以使用iterators
仅显示已添加到地图中的值:
for(
std::map<unsigned, unsigned>::iterator it = numbers.begin();
it != numbers.end();
it++
){
cout << setw(3) << it->first <<": " << it->second << endl;
}
如果允许你使用C ++ 11,那么使用range-for-loops会更简单:
for(auto entry : numbers){
{
cout << setw(3) << entry.first <<": " << entry.second << endl;
}