使用ifstream将数据传递到while循环内的向量

时间:2013-03-28 20:16:47

标签: c++ vector while-loop ifstream

我正在为我的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

编辑:修改了一些注释的东西。我肯定会尝试使用MAP。现在让我感到困惑的最重要的事情(就像 I 那样,这就是为什么数据文件没有传递到矢量中)

1 个答案:

答案 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;
}