Я пытаюсь прочитать файл в многомерном векторе, однако программа получает ошибку «векторный индекс вне диапазона» при достижении последнего набора данных внутри файла.Перегруженный вектор из файла
Файл отформатирован как например:
[Индекс между 1-10000] [пробел] [Rand INT между 1-100]
Однако каждый индекс может происходить в любом месте между 1-50 раз, так файл заканчивает тем, что-то вроде этого:
и все-между (я переписал данные короче, но основа та же).
Вот код:
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 и сохранить их перед продолжением.
Вы должны прочитать о 'while (! File.eof()' [is bad] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered- неверно). –
Почему вы просто не назовете 'push_back' в своем цикле, а не предполагаете, что ваш вектор достаточно велик, чтобы хранить все данные? Даже с проблемой' eof() ', упомянутой @ThomasMatthews, вектор не должен выполняться так, как вы это делаете. Если вы действительно ожидали 10 000, используйте 'push_back', а затем проверьте размер после того, как вы прочитали все данные. – PaulMcKenzie
Я попытался заменить while (! file. eof()) с while (file >> id), и это привело к той же ошибке. При использовании push.back я бы удалил параметры размера, хотя бы синтаксис был бы таким же, как обычный вектор с чем-то вдоль строк : initialVec [tracId] [tracNum] .push_back (num)? – Dozar