2015-12-01 5 views
1

Мне нужно создать вектор векторов из текстового файла. Указанные значения являются целыми числами.Создание вектора векторов из текстового файла

Значения представляют собой фиксированные 3 столбца с различными рядами. Однако я не считаю, что это вызывает мои проблемы. Основная проблема, о которой я думаю, заключается в том, что значения из текстового файла не помещаются в вектор векторов. Соответствующий код выглядит следующим образом:

ifstream infile("material_properties.txt"); 
if (!infile) 
{ 
    cout << "File material_properties.txt not found." << endl; 
    return -1; 
} 

int lines = 0; 
string line; 
while (getline(infile, line)) 
{ 
    ++lines; 
} 

vector< vector<int> > properties(lines,vector<int>(3)); 

while (getline(infile,line)) { 

    for(int i=0; i < lines; i++){ 
     for (int j=0; j<4; j++){ 
      infile >> properties[i][j]; 
     } 
    } 

} 

Я очень новичок в кодировании и очень смущен.

+0

0,1,2,3, где последний из них будет? –

+0

Вы считаете неправильным 'for (int j = 0; j <4; j ++)', как упоминает @MartinJames. –

+0

Ничего себе. Я не знаю, как я испортил это до –

ответ

0

Во-первых

while (getline(infile, line)) 
{ 
    ++lines; 
} 

Собирается не прочитать в файле до он достигает конца файла. Затем, когда вы снова читаете из файла, вы уже в конце, поэтому ничего не будет прочитано. Вместо того, чтобы читать из файла, чтобы найти размер файла, вы можете просто прочитать из файла и ввести значения в вектор. Вектор будет увеличиваться по мере добавления к нему данных автоматически.

ifstream infile("material_properties.txt"); 
vector< vector<int> > properties; 
vector<int> row(3); 
while (infile >> row[0] >> row[1] >> row[2]) 
{ 
    properties.push_back(row); 
} 
+0

Спасибо. У меня было ощущение, что мой код намного сложнее, чем нужно. –

0

Вам нужно перемотать ifstream, добавьте:

infile.seekg(0); 

перед вашим вторым while (getline(infile,line)) {

Это происходит потому, что, когда вы читаете файл, внутренний указатель текущей позиции файла увеличивается. Он увеличивался до конца файла в первом цикле getline, поэтому во втором вам нужно перемотать его назад.

Ваша вторая ошибка в том, что в;

Вы создаете вектор трех элементов в векторе вектора, но в цикле чтения вы добавляете четыре элемента из вашего файла. Вы должны изменить его на vector<int>(4).

Третья проблема, это ваш способ анализа файлов. В вашем втором цикле вы читаете строку за строкой, которая означает, что вы хотите, чтобы разобрать его, но ваш код на самом деле не так:

int i = 0; 
while (getline(infile,line)) { 
    // This actually makes no sense, you have read one line 
    // which you should parse and put results into properties vector. 
    //for(int i=0; i < lines; i++){ 
    // for (int j=0; j<4; j++){ 
    //  infile >> properties[i][j]; 
    // } 
    //}  

    // parsing would look like this (depends on your input file): 
    std::istringstream in(line); 
    in >> properties[i][0] >> properties[i][1] >> properties[i][2]; 
    i++; 
} 
+0

. Я добавил это, однако, когда я делаю cout << свойства [0] [0] << endl; он печатает значение 0 на консоли –

+0

Это третья проблема в вашем коде, но я не знаю ваш входной файл - после того, как вы прочтете строку из него, вы должны разобрать его, но вы на самом деле читаете больше данных из своего файла. – marcinj

Смежные вопросы