2012-03-27 58 views
0

我試圖讀取文件中的行由行,並存儲在一個名爲「命令」對象行數據(持有什麼指令的機器人對象可以理解的信息)整數遞增崩潰應用

下面是讀取功能(C++):

int robot::readfile(const char fname[]) { 
    FILE *rf; 
    rf = fopen(fname, "r"); 

    if (rf != NULL) { 
     int idx = 0; 
     char record[161]; 

     while ((this->cmd_count < this->cmd_size) 
       && (fgets(record, 160, rf) != NULL)) { 
      command tmp_cmd(record); 
      this->cmds[idx++] = tmp_cmd; 
     } 
    } else { 
     perror(fname); 
    } 

    fclose(rf); 
    return 1; 
} 

因此,基本上,在上面的代碼中,當我嘗試通過1遞增變量「IDX」(使用語法:IDX ++),它基本上只是崩潰中的應用。

任何想法,爲什麼?

編輯: 作爲reqested由評論員:

void robot::cmd_malloc(int size) { 
    // most likely will cause problems if size is below 1. 
    if (size < 1) { 
     return; 
    } 

    try { 
     this->cmds = new command[size]; 
     this->cmd_size = size; 
     this->cmd_count = 0; 
    } catch (std::bad_alloc) { 
     // bad allocation exception. 
     this->cmds = NULL; 
     cout << "bad_alloc:" << (sizeof(command) * size) << " in 'robot::cmd_malloc'." << endl; 
    } 

} 
+2

你確定這是導致崩潰的原因,而不是你索引到一個沒有正確初始化的'cmds'表的事實嗎?我們可以看到初始化'cmds'的代碼嗎? – templatetypedef 2012-03-27 00:55:33

+3

你永遠不會增加'this-> cmd_count'? – 2012-03-27 00:57:09

+0

是的,我確定。我甚至試圖從數組中取出增量。當然 - 現在更新問題! – TheAJ 2012-03-27 00:58:02

回答

3

你不是在循環,這意味着在某些時候idx遞增cmd_count變得比cmd_size這會導致程序崩潰更大。編寫代碼的

的C++風格是使用:

  • std::vector<command>,而不是new command[size]。如果你使用std::vector,那麼你不必自己做內存管理,再加上你不必另外維護兩個變量cmd_sizecmd_count,因爲向量本身分別通過size()capacity()成員函數給出這些信息。

  • std::ifstream而不是FILE*。在讀取循環中的輸入時,您應該只使用std::string而不是char[161],儘管我不是而是對此部分有把握,因爲我不確切知道您試圖從流中讀取哪些數據。

+1

謝謝 - 它似乎已經解決了這個問題。 關於編碼風格的建議 - 感謝提示,但可悲的是,我的教授只允許我們使用我們在過去兩個學期中教過的內容。 – TheAJ 2012-03-27 01:08:12