从文件加载多维数组

时间:2013-06-15 11:21:34

标签: c++

我想从文件加载一个多维数组,我有这个代码:

std::vector<std::vector<int>> matrix;
for (int r = 0; r < cols; r++)
{
    std::vector<int> row;
    for ( int c = 0 ; c < cols ; c++ )
    {
        int temp;
        if ( fin >> temp )
        {
            std::cout << temp;
            row.push_back(temp);
        }
    }
    matrix.push_back(row);
}

Cols变量很好,如果我有3x3数组,嵌套循环被调用9次,所以这可以按预期工作...但是看起来文件不能读取单个整数(fin >> temp)。 Fin是文件处理程序。怎么了?

文件内容:

0 1 1
0 0 1
1 1 1

整个代码:

std::vector<std::vector<int>> foo()
{
    std::string filename;
    std::cout << "Filename: ";
    std::cin >> filename;

    std::vector<std::vector<int> > matrix;
    std::ifstream fin(filename);
    if(!fin) {
        std::cout << "Error";
        exit(EXIT_FAILURE);
    }

    std::string line;
    int cols = 0;
    if(fin.is_open()){
        while(!fin.eof()){
            std::getline(fin,line);
            cols++;
        }
    }
    for (int r = 0; r < cols; r++)
    {
        std::vector<int> row;
        for ( int c = 0 ; c < cols ; c++ )
        {
            int temp;
            if ( fin >> temp )
            {
                std::cout << temp; // displays nothing
                row.push_back(temp);
            }
                        std::cout << temp; // displays some crap like -84343141
        }
        matrix.push_back(row);
    }
    std::cin >> filename; // to stop execution and see the results
    return matrix;
}

3 个答案:

答案 0 :(得分:2)

您正在对文件进行第一次传递以确定大小,但是在第一次读取文件后您将需要重新打开该文件。否则,文件中没有剩余数据可供阅读。

答案 1 :(得分:0)

尝试添加

fin.seekg (0, is.beg);
在for循环之前

因为在

std::string line;
int cols = 0;
if(fin.is_open()){
    while(!fin.eof()){
        std::getline(fin,line);
        cols++;
    }
}

您将获得eof

中的文件位置
if ( fin >> temp )

将始终返回false。这就是你需要将位置设置到文件开头的原因。

您也可以替换

while(!fin.eof()){
        std::getline(fin,line);
        cols++;
    }

更容易

while(std::getline(fin,line)) cols++;

答案 2 :(得分:0)

首先读取文件,然后计算行数和列数,然后关闭文件。 然后再次读取文件,现在循环到计算的行和列