У меня есть файл
0 3 2
1 2 3
4 5 6
6 8 1
Если первым номером для каждой строки является строка, вторым номером является столбец, а третий номер - данные, содержащиеся в этой строке, столбце. Это будет заданный массив [8] [8], поэтому я уже инициализировал все до 0, но как я могу сохранить каждое из этих значений данных? Например, я хочу [0] [3] = 2 и [1] [2] = 3. Я хотел бы отслеживать строку, на которой я нашел это значение строки, столбца и данных. Итак, как я могу правильно вставить эти значения в свой 2-D массив?
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...
}
Почему вы читаете в векторе чисел, почему бы вам не писать в rowcol при чтении каждой строки?
// Check myfile and not only myfile.eof()
int row, column, value;
while(myfile >> row >> column >> value) {
rowcol[row][column] = value;
}
Этот код не проверяет, что в одной строке всего 3 номера, в зависимости от требований, которые могут потребоваться, чтобы добавить к ним чек.
Просто прочитайте строку, col val и update thw 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;
}
вы можете использовать векторы
#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];
}
}
Недопустимый код. Если вы определили массив, размер которого имеет размер, равный 8, то в цикле вы должны использовать условие я <8 не я <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] = {};
Что касается кода, который считывает записи из файла, тогда вы должны проверить, что каждая строка содержит ровно три числа, а первые два числа имеют допустимые значения для индексов массива.
int r, c, val; while (myfile >> r >> c >> val) rowcol[r][c] = val;