1

次のようなテキスト ファイルからデータを読み込もうとしています。

161,77,88,255 0,44,33,11,111

など。それを操作する関数があり、配列が正しいサイズであることを確認しています (まだ異なる場合があります)。以下は私の実装の試みです:

bool loadData(int **imgPix, string fileName) {

ifstream inputFile;

inputFile.open(fileName.c_str());

string tempLineRow; //The resulting line from the text file
string tempElementColumn; //The individual integer element 
int numberOfCols = 0;
int numberOfRows = 0;


if (!inputFile.is_open()) {
    return false;
}

imgPix = new int* [numberOfRows];

    while (getline(inputFile, tempLineRow, '\n')) {

        stringstream ss; 
        ss << tempLineRow; //Stringstream version of the line

        while (getline(ss, tempElementColumn, ',' )) {
            stringstream ss2; 
            ss2 << tempElementColumn;
            ss2 >> numberOfCols;

//Prob?         (**imgPix) = *(*(imgPix + numberOfRows) + numberOfCols);
            numberOfCols++;

        }

        numberOfRows++;

    }   

inputFile.close();
return true;

}

他にもある可能性はありますが、それが私のエラーの原因であると信じているため、ダブルポインター割り当ての行にコメントを付けました。2D 配列を繰り返し更新するために実装した while ループ構造を使用する方法がわかりません。

誰でも何か援助を提供できますか? 大歓迎です!

4

3 に答える 3

0

以前の回答は有効ですが、連続したメモリが要件ではない場合、この場合、多くのメモリの再割り当てを避けるために、sstd::dequeと比較して s を選択することをお勧めします。std::vector

于 2013-05-18T12:37:13.310 に答える
0

あなたのコードにはいくつかの問題があります。ほとんどの場合、組み込み配列が C++ でどのように機能するかを完全に理解していなかったためだと思います。ここでの主な問題は、それらが動的に簡単に拡張できないことです。これらの配列の「サイズ変更」操作はありません (ただし、ここでは必要になります)。std::vector<int>そのため、 andを使用してコードを書き直すことをお勧めします。新しい行または列を格納するときstd::vector< std::vector<int> >は必ず を使用.resizeし、この新しい実装で問題が発生した場合は戻ってもう一度質問してください。

于 2013-05-18T12:13:55.687 に答える
0
imgPix = new int* [numberOfRows]

ここでは numberOfRows = 0 であるため、十分なメモリを割り当てていません。メモリを割り当てる前に、配列の次元を知る必要があります。次に、配列の各行にメモリを割り当てる必要があります。

imgPix[currentRow] = new int [TotalCols];

2 次元の長方形配列の場合、TotalRows*TotalCols 要素の 1 次元配列を作成してから、 formula を使用してアクセスする方が効率的A(row, col) = A[row*TotalCols + col]です。

于 2013-05-18T12:15:41.317 に答える