【问题标题】:Loading multidimentional array from a file从文件加载多维数组
【发布时间】:2013-06-15 11:21:34
【问题描述】:

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

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 &gt;&gt; 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;
}

【问题讨论】:

  • 该文件只是一个简单的矩阵,其中总是列 = 行。
  • @DavidJashi:不,它没有。它只读取下一个整数。
  • @user2252786:您考虑过fin &gt;&gt; temp 失败的可能性吗?您的代码应处理并报告此问题。
  • 所以这应该可行...?我通过几个测试发布了整个功能,也许这会给你一些提示。
  • 为什么那个循环首先读取整个文件?

标签: c++


【解决方案1】:

您正在第一次通过文件以确定大小,但您需要在第一次读取文件后重新打开文件。否则,文件中没有数据可供读取。

【讨论】:

    【解决方案2】:

    尝试添加

    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++;
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-09
        • 2017-03-10
        • 1970-01-01
        • 2018-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        相关资源
        最近更新 更多