1

ファイルから多次元配列をロードしたいのですが、次のコードがあります。

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;
}
4

3 に答える 3

2

サイズを決定するためにファイルの最初のパスを実行していますが、最初にファイルを読み取った後、ファイルを再度開く必要があります。それ以外の場合、読み取るデータがファイルに残っていません。

于 2013-06-15T11:34:07.717 に答える
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++;
于 2013-06-15T11:39:33.910 に答える
0

最初にファイルを読み取り、行と列の数を計算してから、ファイルを閉じます。次に、もう一度ファイルを読み取り、計算された行と列までループします

于 2013-06-15T12:45:42.600 に答える