2015-12-12 2 views
0

Я пытаюсь прочитать файл в многомерном векторе, однако программа получает ошибку «векторный индекс вне диапазона» при достижении последнего набора данных внутри файла.Перегруженный вектор из файла

Файл отформатирован как например:

[Индекс между 1-10000] [пробел] [Rand INT между 1-100]

Однако каждый индекс может происходить в любом месте между 1-50 раз, так файл заканчивает тем, что-то вроде этого:

http://pastebin.com/gvpd1HC0

и все-между (я переписал данные короче, но основа та же).

Вот код:

ifstream file; 
int frequentCatcher[1000]; 
int numDistItems = 10000; 
vector< vector<int> > initialVec(numDistItems, vector<int>(50)); 

file.open("T25.N0.1K.D10K.txt"); 

for (int i = 0; i <= 999; i++)  //This loop sets all cells to 0 to begin. 
{ 
    frequentCatcher[i] = 0; 
} 

if (file.good()) 
{ 
    int tracId = 1, tracNum = 0;  //counters to track position in file 
    int id, num;      //tracks actual data contained in file 

    while (!file.eof())     //traverse file 
    { 
     file >> id;     //input from file 
     file >> num; 

     if (tracId == id) 
     { 
      initialVec[tracId][tracNum] = num; 
      tracNum++;    
     } 
     else 
     { 
      tracId++; 
      tracNum = 0;  //reset item number each time a new transaction occurs 
      initialVec[tracId][tracNum] = num; 
      tracNum++; 
     } 
    } 

Ошибка возникает в момент ид превращается в 10000, брошено вектор ошибки и сбои программы. Это после того, как tracNum был сброшен на 0, однако файл все равно должен прочитать все значения 10000 и сохранить их перед продолжением.

+1

Вы должны прочитать о 'while (! File.eof()' [is bad] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered- неверно). –

+1

Почему вы просто не назовете 'push_back' в своем цикле, а не предполагаете, что ваш вектор достаточно велик, чтобы хранить все данные? Даже с проблемой' eof() ', упомянутой @ThomasMatthews, вектор не должен выполняться так, как вы это делаете. Если вы действительно ожидали 10 000, используйте 'push_back', а затем проверьте размер после того, как вы прочитали все данные. – PaulMcKenzie

+0

Я попытался заменить while (! file. eof()) с while (file >> id), и это привело к той же ошибке. При использовании push.back я бы удалил параметры размера, хотя бы синтаксис был бы таким же, как обычный вектор с чем-то вдоль строк : initialVec [tracId] [tracNum] .push_back (num)? – Dozar

ответ

0

Проблема заключается в предположении, что вектор [i] [j] уже существует. С векторами, они пусты, пока вы не резерв некоторые слоты или толчок элемент в вектор.

Вектор вектора может быть не лучшим, потому что вы не знаете диапазон ключей перед рукой. Если вы видите индексный порядок в 1, 5, 3, 2, 4, у вас будут проблемы, потому что они не смежны.

ИМХО, лучшим решением будет std::map<int, vector<int> >. map лучше подходит для сортировки, когда диапазон ключей неизвестен или нет в отсортированном порядке. С помощью карты вы можете проверить, существует или нет индекс (ключ). Если ключ не существует, вы можете создать новый вектор и вставить его в карту вместе с ключом.

Если ключ действительно существует, вы push_back значение в вектор.

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