从文件读取输入并填充数组以存储数据供以后使用

时间:2013-12-05 09:33:35

标签: c++ arrays c++11 vector

我正在尝试创建多个包含输入文件内容的最大大小为10的数组。假设文件的格式如下:

1 3 2 4 0 5 8 -3
3 1 4 6 0 3
4 83 2 12 1 3
4 30 4 -2

每行不能超过10个整数。

void read_input(ifstream &file)
{
    vector<array<int, 10> > main_array;

    while(!(file.eof()))
    {
        int idx = 0;
        string values;
        array<int, 10> part_array;

        getline(file, values);
        istringstream inStream;
        inStream.str(values);

        while((inStream >> part_array[idx++]).good() == true);
        main_array.push_back(part_array);

        file.ignore();
    }

    for(auto it = main_array.begin(); it != main_array.end(); it++)
    {
        for(auto& s: *it)
        {
            cout << s <<  " ";
        }
        cout << "\n";
    }
}

这给了我输出:

1 3 2 4 0 5 8 -3 0 6164240
1 4 6 0 3 5 8 -3 0 6164240
83 2 12 1 3 5 8 -3 0 6164240
30 4 -2 1 3 5 8 -3 0 6164240

这显然是错误的。我知道这可能与我迭代未初始化的数组元素,但我怎么能避免这个错误?就像一个注释,本质上我使用数组来保存文件中每行的值。也就是说,一个数组必须处理第一行中的整数;另一个在第二行...

5 个答案:

答案 0 :(得分:2)

您可以使用

 vector<vector<int> > main_array;

而不是数组 - 然后只需从输入中读取项目并将它们(push_back)推送到“内部”向量中 - 这样,如果数据行短于10个元素,则最后不会有未初始化的数组元素

完整的解决方案可能如下所示(为了保持一致性,我保留了原始代码的某些部分):

using namespace std;

void read_input(ifstream &file)
{
    vector<vector<int> > main_array;

    string line;    //buffer for single line read from file 
    // reading part
    while(getline(file, line))
    {       
        stringstream inStream(line);
        vector<int> row;    //single row buffer
        int val = 0;
        while(inStream >> val)
        {
            row.push_back(val);
        }       
        main_array.push_back(row);
    }   

    //display part
    for(auto it = main_array.begin(), end = main_array.end(); it != end; ++it)
    {
        for(auto& s: *it)
        {
            cout << s <<  " ";
        }
        cout << "\n";
    }
}

答案 1 :(得分:2)

如果您觉得有用,请使用此

void readData(ifstream &inf)
{
    string str;
    vector<vector<int>> intArr;

    while (getline(inf, str))
    {
        stringstream ss(str);
        int i;
        vector<int> a;
        while (ss >> i)
        {
            a.push_back(i);
        }
        intArr.push_back(a);
    }
}

您不应使用eof()来检查文件结尾。

答案 2 :(得分:1)

std :: array是一个封装常量大小数组的容器。因此,通过使用array<int, 10>声明,数组中已经有10个整数。您需要使用向量,然后更改循环

 while((inStream >> part_array[idx++]).good() == true);

 bool good = true;
 while(idx <10 ) {
     int v;
     if(!(inStream >> v).good() ) break;
     idx++;
     part_array.push_back(v); //now a vector
 }

答案 3 :(得分:0)

您使用了包含10个元素的array但您知道可能少于10个项目。最好使用矢量,push_back你拥有的东西。

除此之外,代码存在各种潜在问题。如果你发送一个错误的ifstream,它会陷入循环。

while(!(file.eof()))正在寻找麻烦。

接下来,file.ignore();然后忽略每行的第一项。如果您按照人们的说法更改为使用向量向量,请使用while(getline(file, values))而不是使用eof检查并删除它应该有效的ignore

答案 4 :(得分:-1)

更改此行

array<int, 10> part_array;

array<int, 10> part_array = {};