2014-12-02 61 views
-2

首先,我想讓你知道我是一個大學生(我們的編程教學大綱不是那麼先進)(順便說一句,我沒有要求我的任務等答案,我只是練)。當從一個文件中讀取時崩潰

行,所以我有2個問題

  1. 我的代碼中的一些功能,改變了我的數組的值(當我不希望它)
  2. 我真的不知道,但似乎得到了一些從一個文件存儲到我的數組中的值會使程序崩潰,此外,在用代碼弄弄了一下之後(我不知道什麼改變了),它在所述部分期間不再崩潰,但它仍然在代碼的末尾崩潰執行..

我希望你們可以幫助我,我b整天都在尋找。

#include <iostream> 
#include <fstream> 
#include <string> 
#include <iomanip> 

using namespace std; 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */ 
void readFile (float x[], int &y) { 
    ifstream load; 
    string filename; 
    cout << "Enter the name of the file: "; 
    cin >> filename; 

    load.open(filename.c_str()); 
    while (!load.eof()) { 
     load >> x[y]; 
     y++; 
    } 
    if (!load) { 
     cout << "asd"; 
    } 

} 

void computeC (float x[], int y, float z[]) { 
    int v=0; 

    for (v=0; v<=y; v++) { 
     z[v] = (5 * (x[v] - 32)/9); 
    } 
} 

float average (float x[], int y) { 
    int v=0; 
    float sum=0; 
    for (v=0; v<=y; v++) { 
     sum += x[v]; 
    } 

    return sum/v; 
} 

void grade (float x[], char grades[], int y, int &hi, int &med, int &lo) { 
    int v=0; 
    hi = med = lo = 0; 
    for (v=0; v<=y; v++) { 
     if (x[v] >= 35) { 
     grades[v] = 'H'; 
     hi++; 
     } 

     else if ((x[v] < 35) && (x[v] >= 20)) { 
     grades[v] = 'M'; 
     med++; 
     } 

     else if (x[v] < 20) { 
     grades[v] = 'L';  
     lo++; 
     } 
    } 

} 

void writeFile (float x[], float y[], int z, char w[]) { 
    ofstream save; 
    int v=0; 


    for (v=0; v <= z; v++) { 
     cout << "C(Celcius)" << left << setw(5); 
     cout << "F(Farenheit)" << left << setw(5); 
     cout << "Description\n"; 
     cout << right << setw(7) << y[v]; 
     cout << left << setw(8) << x[v]; 
     cout << left << setw(8) << w[v];   
    } 
} 
int main(int argc, char** argv) { 
    int ctr=0, high, medium, low; 
    float F[ctr], C[ctr], ave; 
    char grades[ctr]; 


    readFile (F, ctr); 
    computeC (F, ctr, C); 
    ave = average (C, ctr); 
    grade (C, grades, ctr, high, medium, low); 

    cout << "Average of the temperatures: " << ave << endl; 
    cout << "Number of high temperatures: " << high << endl; 
    cout << "Number of medium temperatures: " << medium << endl; 
    cout << "Number of low temperatures: " << low << endl; 

    //writeFile (F, C, ctr, grades); 


    return 0; 
} 

(代碼從https://drive.google.com/file/d/0BxeZTCUL3Q4oZHlqWFdjMDZub0E/view?usp=sharing

+1

歡迎來到SO。如果你想獲得幫助,你的問題可以做一些改進。嘗試讀這:http://stackoverflow.com/help/how-to-ask告訴我們什麼不工作。 – 2014-12-02 08:39:14

+0

歡迎來到stackoverflow.com。請花些時間閱讀[幫助頁面](http://stackoverflow.com/help),尤其是名爲[「我可以問些什麼話題?」]的章節(http://stackoverflow.com/help/)討論話題)和[「我應該避免問什麼類型的問題?」](http://stackoverflow.com/help/dont-ask)。另請[請閱讀如何提出好問題](http://stackoverflow.com/help/how-to-ask)。您可能還想了解如何創建[最小化,完整和可驗證的示例](http://stackoverflow.com/help/mcve)。 – 2014-12-02 08:39:56

+1

至於你的問題,首先不要做'while(!load.eof())',因爲它不會像你期望的那樣工作。在你試圖從文件末尾讀取之後,'eofbit'標誌將不會被設置,所以你的循環會迭代一次到很多次。其次,在你的'main'函數中,你聲明數組'F'和'C'具有* zero size *!這意味着對它們的每次訪問(讀或寫)都將超出導致[* undefined behavior *](http://en.wikipedia.org/wiki/Undefined_behavior)的界限。 – 2014-12-02 08:45:37

回答

0

沒有檢查全部的代碼,我可以直接想到的代碼的某些部分。

讓我先

while (!load.eof()) { 
     load >> x[y]; 
     y++; 
    } 

你寫大於x []可以保留和你的程序將在這種情況下崩潰更多的價值。

確保只寫入您的陣列,直到分配的最大內存。

問題是:load.eof()不會做你期望的操作,因爲它會從文件末尾讀取。它會再次執行你的循環。

二:

int ctr=0, high, medium, low; 
    float F[ctr], C[ctr], ave; 
    char grades[ctr]; 

ctr0所以你聲明的F, c and grades陣列0元素。這不是很聰明;)你不能讀或寫他們。

+0

我該如何解決這個問題?我試過不將ctr初始化爲0(這會使程序在啓動時崩潰)。我需要程序本身來確定要存儲到數組中的數據的數量(然後,數字變成數組的大小)有什麼辦法可以實現這一點? – 2014-12-03 14:26:12

+0

是以幾種方式。您可以使用std :: vector之類的「容器」,或者在運行時使用「new」運算符動態分配內存。 – Stefan 2014-12-03 14:29:02

相關問題