0

私はファイルを持っています

0 3 2

1 2 3

4 5 6

6 8 1

各行の最初の数字は行、2 番目の数字は列、3 番目の数字はその行、列に含まれるデータです。これは特定の [8][8] 配列になるため、すべてを 0 に初期化しましたが、これらのデータ値をそれぞれ格納するにはどうすればよいでしょうか? たとえば、[0][3] =2 と [1][2] = 3 が必要です。その行、列、およびデータ値を見つけた行を追跡したいと思います。では、これらの値を 2 次元配列に正しく挿入するにはどうすればよいでしょうか?

int rowcol[8][8];
    for (int i=0; i < 9; i++)
        for (int j=0; j < 9; j++)
        {
            rowcol[i][j] =0;
        }

 ifstream myfile;
int nums;
myfile.open(text.c_str());
while (!myfile.eof()) {
    myfile >> nums;
    numbers.push_back(nums);
}
for (int i=0; i < numbers.size(); i++)
{

   //Not sure what the best approach here would be and I'm not even sure if I should have done a vector...

}
4

4 に答える 4

2

なぜ数値ベクトルに読み込むのですか?すべての行を読み取るときに、rowcol に直接書き込まないのはなぜですか?

// Check myfile and not only myfile.eof()
int row, column, value;
while(myfile >> row >> column >> value) {
    rowcol[row][column] = value;
}

このコードは、1 行に 3 つの数字しかないことをチェックしません。要件によっては、チェックを追加する必要がある場合があります。

于 2013-10-30T15:48:54.233 に答える
0

ベクトルを使用できます

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;


vector<int> split(string line,char delm)
{
    vector<int> tokens;
    string num="";
    for(int i=0;i<line.length();i++)
    {
        char c = line[i];
        if(c == delm)
        {
            tokens.push_back(atoi(num.c_str()));
            num="";
        }else
        {
            num+=c;
        }
    }
    return tokens;
}

string text="file.txt";


int main()
{
    string line = "";
    ifstream infile;

    infile.open(text.c_str());
    vector<vector<int>> mydata;

    while (!infile.eof())
    {
        getline(infile, line);
        mydata.push_back(split(line,' '));
    }
    infile.close();

    system("pause");
    return 0;
}

配列に変換したい場合

int rowcol[8][8];
    for (int i=0; i < mydata.size(); i++)
    {
        vector<int> d = mydata[i];
        for (int j=0; j < d.size(); j++)
        {
            rowcol[i][j] =d[j];
        }
    }
于 2013-10-30T16:50:46.873 に答える
0

あなたのコードは無効です。1 つの次元のサイズが 8 に等しい配列を定義した場合、ループでは、条件 i < 8 ではなく、 i < 9 を使用する必要があります。

int rowcol[8][8];
    for (int i=0; i < 9; i++)
        for (int j=0; j < 9; j++)
        {
            rowcol[i][j] =0;
        }

さらに、そのような初期化は、配列が定義されているときに行うことができます

int rowcol[8][8] = {};

ファイルからレコードを読み取るコードについては、各行に正確に 3 つの数値が含まれていることと、最初の 2 つの数値が配列のインデックスとして許容できる値であることを確認する必要があります。

于 2013-10-30T16:02:10.950 に答える
0

行、col val を読み取り、rowcol を更新するだけです。

int rowcol[8][8];

for (int i=0; i < 9; i++)
    for (int j=0; j < 9; j++)
    {
        rowcol[i][j] =0;
    }

myfile.open(text.c_str());

while (!myfile.eof()) {
    int row, col, val;
    myfile >> row >> col >> val;
    rowcol[row][col] = val;
}

より良い解決策は、行の数を示す数字を持つことができます:

// file struct
2
0 0 1
0 1 2

template< typename T >
inline T read( std::istream& is )
{
    T res;
    is >> res;
    return res;
}     

int rowcol[8][8];

for (int i=0; i < 9; i++)
    for (int j=0; j < 9; j++)
    {
        rowcol[i][j] =0;
    }

myfile.open(text.c_str());

const size_t COUNT = read<int>( myfile );

for ( int i = 0; i < COUNT; ++i )

    int row = read<int>( myfile );
    int col = read<int>( myfile );
    int val = read<int>( myfile );

    rowcol[row][col] = val;
}
于 2013-10-30T15:50:56.547 に答える