2010-12-06 167 views
2

我的程序编译罚款,但输入文件后,我得到一个“分段错误(核心转储)”错误。我没有正确处理ostream吗?分割错误(核心转储)错误

#include <std_lib_facilities.h> 

struct Reading { 
    int hour; 
    double temperature; 
    Reading(int h, double t): hour(h), temperature(t) { } 
    bool operator<(const Reading &r) const; 
}; 

bool Reading::operator<(const Reading &r) const 
{ 
// stub version                       

    if (temperature < r.temperature){ 

     return true; 

} 
    else if (r.temperature < temperature) { 

     return false; 
    } 


} 

/*                          
* function declarations                     
*/ 

ostream& operator<<(ostream& ost, const Reading &r); 

vector<Reading> get_temps(); 

double check_adjust_temp(double temperature, char scale); 

double c_to_f(double temperature); 

double mean(vector<Reading> temps); 

double median(vector<Reading> temps); 

void print_results(const vector<Reading>& temps, double mean_temp, 
        double median_temp); 

int main() 
    try 
     { 
      vector<Reading> temps = get_temps(); 
      if (temps.size() == 0) error("no temperatures given!"); 
      double mean_temp = mean(temps); 
      sort(temps.begin(), temps.end()); 
      double median_temp = median(temps); 
      print_results(temps, mean_temp, median_temp); 
     } 
    catch (exception& e) { 
     cerr << "error: " << e.what() << '\n'; 
     return 1; 
    } 
    catch (...) { 
     cerr << "Oops: unknown exception!\n"; 
     return 2; 
    } 

/*                          
* function definitions                     
*/ 

ostream& operator<<(ostream& ost, const Reading &r) 
{ 

    return ost << '(' << r.hour 
       << ',' << r.temperature <<')'; 
} 

vector<Reading> get_temps() 
{ 
    cout << "Please enter name of input file name: "; 
    string name;; 
    cin >> name; 
    ifstream ist(name.c_str()); 
    if(!ist) error("can't open input file ", name); 

    vector<Reading> temps; 
    int hour; 
    double temperature; 
    while (ist >> hour >> temperature){ 
     if (hour <0 || 23 <hour) error("hour out of range"); 
     temps.push_back(Reading(hour,temperature)); 
    } 

} 

double check_adjust_temp(double temperature, char scale) 
{ 
    if (scale == 'c' || 'C'){ 

     return c_to_f(temperature); 
    } 
    else if (scale == 'f' || 'F') { 

     return temperature; 
    } 
    else { 

     error("Wrong input type"); 
    } 
} 

double c_to_f(double temperature) 
{ 
    double c; 
    c = ((temperature * (9.0/5)) + 32); 
    return (c); 
} 

double mean(vector<Reading> temps) 
{ 
    double mean_temp; 
    double sum = 0; 
    for (int i = 0; i< temps.size(); ++i) sum += temps[i].temperature; 
    mean_temp = sum/temps.size(); 
    return (mean_temp); 
} 

double median(vector<Reading> temps) 
{ 
    double median_temp; 
    sort (temps.begin(), temps.end()); 
    median_temp = temps[temps.size()/2].temperature; 
    return (median_temp); 
} 

void print_results(const vector<Reading>& temps, double mean_temp, 
        double median_temp) 
{ 

    cout << "The sorted temperatures are:\n"; 
    cout << get_temps; 
    cout << "The mean temperature is " << mean_temp << ".\n"; 
    cout << "The median temperature is " << median_temp << ".\n"; 
} 

回答

4
scale == 'c' || 'C' 

没有做什么,你认为它。它解析如下:

(scale == 'c') || 'C' 

and 'C'总是如此。如果您启用了编译器警告,您应该已经注意到了这一点。

(不,这不是你的眼前问题,它在get_temps年底的上升,但启用了警告,你会看到这一点。)

+0

对不起,我的编译器没有捕捉任何东西,我不能完全得到警告正常工作。你能否详细解释get_temps结尾处的问题?谢谢。 – John 2010-12-06 04:49:09

0

附加一个调试器,并通过您的代码步。有可能你除以0或跑过数组的末尾。至少我们需要更多的信息,然后才能提供帮助。

0

你在linux机器上编译?如果是这样,Valgrind是诊断分段故障错误的好工具。

0

error是做什么用的?如果它没有抛出异常,那么调用它的代码将继续使用伪造数据。

cin >> name;只从标准输入中读取“单词”,而不是整行。所以如果文件名中有空格,你的程序将不会得到正确的文件名。