2015-05-20 3 views
-4

Im жаль размещения супер длинный код, но когда я запускаю этот код все, что я вижу this- Heap Размер: 1638652 Получение INT: Получение INT: Получение INT: Получение INT: Получение INT: Heap size: 1638653 , и он продолжает перемещаться в цикле, при этом heapsize увеличивается на единицу.Бесконечная петля на C++ почему?

#include <iostream> 
#include <fstream> 
#include <algorithm> 
#include <vector> 
#include <exception> 

#ifndef WX_REPORT_H 
#define WX_REPORT_H 


#include <string> 
#include <sstream> 
using std::string; 
using std::stringstream; 

typedef struct WX_REPORT 

{ 
    string unitType; 
    string stationName; 
    string time; 
    string gpsLoc; 
    int pressure; 
    int windSpeed; 
    int temperature; 
    int humidity; 
    int windDirection; 

    string toString() 
    { 
     stringstream str; 
     str << stationName << ": " << time << "\t" << gpsLoc << "\n"; 
     str << pressure << "\n" << windSpeed << "\n" << temperature << "\n"; 
     str << humidity << "\n" << windDirection; 
     return str.str(); 
    } 
} 
WXReport; 

#endif 
/* 
* Reports must be in the following format: 
* M or I // Metric or imperial units 
*/ 
using namespace std; 

vector<WXReport*> heap; 

bool compTime(const WXReport* a, const WXReport* b) { 
    if(a->time < b->time) { // timing 
     return false; 
    } else { 
     return true; // commands to return true 
    } 
} 

void heapAdd(WXReport* wx) { 
    heap.push_back(wx); 
    push_heap(heap.begin(), heap.end()); 
} 

WXReport* heapPop() { // header popup 
    pop_heap(heap.begin(), heap.end()); 
    WXReport* rep = heap.back(); 
    heap.pop_back(); 
    return rep; 
} 

void getInt(istream &input, int &i) { 
    string temp; 
    input>>temp; 
    cout<<"Getting int: "<<temp<<endl; 
    i = atoi(temp.c_str()); 
} 

void readInFile(string filename) { 
    ifstream input(filename); 
    WXReport *report; 
    while(!input.eof()) { 
     report = new WXReport(); 
     getline(input, report->unitType); 
     getline(input, report->stationName); 
     getline(input, report->time); 
     getline(input, report->gpsLoc); 
     getInt(input, report->pressure); 
     getInt(input, report->windSpeed); 
     getInt(input, report->temperature); 
     getInt(input, report->humidity); 
     getInt(input, report->windDirection); 
     heapAdd(report); 
     cout<<"Heap size: "<<heap.size()<<endl; 
    } 
} 

int menu() { 
    cout<<"\n\nPlease select one: "<<endl; 
    cout<<"1) Read in another file"<<endl; 
    cout<<"2) Display the fastest wind speed"<<endl; 
    cout<<"3) Display weather stations by name"<<endl; 
    cout<<"4) Display all weather reports"<<endl; 
    cout<<"5) Remove a weather report"<<endl; 
    cout<<"6) Write weather reports to file"<<endl; 
    cout<<"0) Exit"<<endl; 
    int choice; 
    cin>>choice; 
    return choice; 
} 

void printAllReports() { 
    cout<<"Printing all reports"<<endl; 
    for(WXReport* rep: heap) { 
     cout<<rep->toString()<<endl; 
    } 
    cout<<"Done printing reports"<<endl; 
} 

int main(int argc, char* argv[]) { 
    string filename = "report.txt"; 
    readInFile(filename); 

    int choice = menu(); 
    while(choice != 0) { 
     switch(choice) { 
      case 1: 
       cout<<"What file would you like to read in?"<<endl; 
       cin>>filename; 
       readInFile(filename); 
       break; 
      case 2: 
       cout<<"Has not been implemented"<<endl; 
       break; 
      case 3: 
       cout<<"Has not been implemented"<<endl; 
       break; 
      case 4: 
       printAllReports(); 
       break; 
      case 5: 
       cout<<"Has not been implemented"<<endl; 
       break; 
      case 6: 
       cout<<"Has not been implemented"<<endl; 
       break; 
      default: 
       cout<<"Invalid choice, please try again."<<endl; 
     } 
     choice = menu(); 
    } 
    cout<<"Thank you!"<<endl; 

    return 0; 
} 
+3

Не * * уверен, что это вызывает проблему, которую вы видите, но 'в то время как (! Input.eof())' обычно нарушается. –

+0

Один классик: 'while (! Input.eof())' Откуда вы знаете? Вы еще ничего не читали. Откуда вы знаете, что вы даже открыли файл? – user4581301

+0

@ user4581301, так что бы вы, ребята, мне рекомендовали? – newb12345

ответ

0

Важная часть. Если вы ничего не читаете, прочтите следующее: Всегда проверяйте коды ошибок и возвращайте значения.

После ifstream input(filename); вы понятия не имеете, открыт ли файл. Тестирование с помощью input.is_open() прошло.

Если файл не открыт, все эти вызовы getline не работают как eof(). Файл не открыт, не может прочитать конец файла и не может выйти из цикла. Даже если файл открыт, если вы не проверяете вывод getline, откуда вы знаете, что читаете строку?

Один из забавных частей потоков, если вы испытываете поток, он говорит вам, если оно находится в плохом состоянии, так что вы можете написать код, который выглядит

if (getline(...) && getline(...) && ...) 

Таким образом, вы не имеете сделать массивный блок if-else-if или море вложенных ifs. Первое плохое чтение, и вы отсутствуете.

Проблема с if eof() рассматривается в комментариях к вопросу. Основной вопрос заключается в том, что вы не знаете, есть ли у вас конец файла, пока вы не начнете чтение. Кроме того, что произойдет, если вы нажмете конец файла в середине кучи прочтений?

Так что прочитайте строку. Если это хорошо, прочитайте следующую строку и т. Д. До тех пор, пока не закончите.

getInt не требуется.

int val; 
input >> val; 

загружает целое число в val, если поток можно разобрать в int. Если это невозможно, ввод помечен как плохой, и вы можете проверить, почему. Может быть непостижимым. Может быть конец файла.

int val; 
if (input >> val) 
{ 
    //do stuff 
} 
else 
{ 
    //no int here. Do other stuff 
} 

Так же, как и выше, вы можете приковать инструкции и получить

if (input >> val >> anotherval >> ...) 
+0

wow это действительно помогло, но скажем, я не хочу хранить его в файле, чтобы избежать всего этого eof(), как бы просто сохранить его на C++ и не открывать файл? – newb12345

+0

@ newb12345: Ваш вопрос будет намного яснее, если вы исправите орфографию и знаки препинания, а также укажите, что это такое. – Beta

+0

В C++ внедрить кризисный центр («сортировочная программа») для центра ураганов. Вы можете использовать STL или собственный код. Повторный код должен быть явно подтвержден и ваш вклад четко обозначен. Как инженер программного обеспечения для местного метеорологического института, вы будете получать сообщения о погоде, содержащие: Погода название станции Время и дата местоположение GPS барометрического давления (в гектопаскаль или дюймах ртутного столба) скорости ветра (в км/ч, миль/ч или узлы) Температура (по Цельсию или Фаренгейту) Влажность (в процентах) Направление ветра – newb12345

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