2013-06-10 3 views
1

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

MovieRating base[baseNum]; 
MovieRating test[NUM_RATINGS - baseNum]; 


//load the base data set 
string line =""; 
ifstream baseF("assets/u1.base"); 
ifstream testF("assets/u1.test"); 
if(baseF.fail()){ 
    cout << "Unable to open File. Program Terminating..."<<endl; 
    return 1; 
} 

int i = 0; 
getline(baseF, line); 
while(baseF || i < sizeof(base)){ 
    base[i] = StringToRating(line); 
    i++; 
    getline(baseF,line); 
} 

cout << base[15000].mId << " " << base[15000].uId << " " << base[15000].rating << " " << base[15000].timestamp << endl; 
baseF.close(); 
cout << base[15000].rating << endl; 


//load testing dataset 
if(testF.fail()){ 
    cout << "Unable to open File. Program Terminating..."<<endl; 
    return 1; 
} 


i = 0; 
getline(testF, line); 
while(testF || i < sizeof(test)){ 
    test[i] = StringToRating(line); 
    i++; 
    getline(testF,line); 
} 
testF.close(); 
cout << base[15000].rating << endl; 

GlobalMeanValue(base, test); 
return 0; 

NUM_RATINGS является 100000 и baseNum составляет 80000

Выхода из первых два couts правильно, третье значение мусора после загрузки последних 20000 рейтингов фильмов. Каждый MovieRating 16 байт.

Еще раз спасибо

Кроме того, я почти забыл это на системе Linux 64-битным.

ответ

2

Ваша проблема имеет два аспекта, и на этой линии while(baseF || i < sizeof(base)){:

Во-первых, вы имеете в виду использовать && вместо || так, что когда-то вход израсходованы вы сделали.

Во-вторых, sizeof(base) это общий размер массива, а не количество элементов, которое было на sizeof(base)/sizeof(base[0])

+0

вау .. не могу поверить, что я пропустил, что один. Большое вам спасибо, просто исправил ors для ands, и он отлично работал. Что касается sizeof (base), правильно ли мне сохранить его, как это было, поскольку все, что я в основном делаю, это убедиться, что я не пишу за пределами массива? Еще раз спасибо! –

+0

oh nevermind Я понимаю, что вы сейчас говорите, провела несколько тестов, чтобы объяснить это себе. Спасибо –

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