2015-12-09 135 views
0

我是來自Java的C++的新手,我面臨着C++ I/O的問題。我製作了一個小程序來說明我的問題。主要思想是通過讀取具有特定文本格式的文本文件來使三維數組初始化其值。該文件包含作爲第一維的級別(L)的數量以及作爲第二維和第三維(數組[L] [N] [N])的行和列的大小(N)。C++損壞的雙鏈表

編輯:執行我的計劃,我使用g++ -std=c++0x program.cpp

下面是程序:

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

using namespace std; 

int num_of_stages; 
int N ; 
string ***stages; 

void readFile(string file_name){ 
    string line; 
    int pos; 

    ifstream file (file_name); 

    if (file.is_open()){ 

     getline (file,line);     // L=XXX 
     pos = line.find("="); 
     line = line.substr(pos+1); 
     num_of_stages = atoi(line.c_str()); 
     cout << "L=" << num_of_stages << endl; 

     getline (file,line);     // N=XXX 
     pos = line.find("="); 
     line = line.substr(pos+1); 
     N = atoi(line.c_str()); 
     cout << "N=" << N << endl;  

     // setting the stages array with dimensions stages[L][N][N] 
     stages = new string**[num_of_stages]; 
     for(int i = 0 ; i < N ; i ++){ 
      stages[i] = new string*[N]; 
      for(int j = 0 ; j < N ; j++){ 
       stages[i][j] = new string[N]; 
      } 
     } 

     for(int i = 0 ; i < num_of_stages ; i++){ 
      getline (file,line);    // Level comment 
      cout << "Level " << line << endl; 
      for(int j = 0 ; j < N ; j++){ 
       for(int k = 0 ; k < N ; k++){ 
        string currentValue ; 
        file >> currentValue; 
        stages[i][j][k] = currentValue; 
        cout << currentValue << " " ; 
       } 
       cout << endl; 
      } 
      cout << endl << endl; 
      // I am guessing that this getLine() 
      // is necessary to read the end of the line 
      // if I try remove it everything goes wrong 
      // everytime I print the line's values is ' ' (empty) 
      getline (file,line); 
      // remove any string value to detect end of file   
      // so the if statement below will be true 
      line.clear(); 
     } 
     getline (file,line);     // END OF MAZE comment 
     cout << line << endl; 
     if(line != "END OF MAZE"){ 
      cout << "Wrong file format" << endl; 
      file.close(); 
      exit(0); 
     } 
     file.close(); 
    }else{ 
     cout << "Missing file with name : " << file_name << endl; 
     exit(0); 
    } 
    // program never reach that point 
    cout << "Bla bla bla" << endl; 
} 

int main(){ 
    readFile("file1.maz"); 
    return 0; 
} 

我的文件中有這樣的文字格式:

L=5 
N=16 
LEVEL 1 
T2 T3 T1 T2 E E T1 E E T2 T2 T1 T2 T1 T2 T1 
T1 T1 T2 T1 T2 T3 T2 T3 T2 T2 T3 T3 T1 E T3 T1 
T2 E T1 T1 T3 T2 T1 T3 E T3 T3 E T1 E T1 T1 
T1 T3 T2 E T1 T1 T2 E T2 T2 T2 T1 T3 T3 T1 T3 
E E T1 T3 T1 T3 T1 T2 T2 T1 T1 E T2 T1 T1 T3 
T2 T1 T1 T3 T3 E T2 T3 T3 T2 T1 E T3 T2 T1 T2 
T2 T1 T3 T2 T2 E T2 E E E T3 T3 T2 T3 T3 T1 
E E E T2 E E T3 E T1 T2 T1 T2 T1 T3 T3 E 
T3 T2 T1 T3 E T1 E T2 T3 T1 T2 T2 T3 T2 E T1 
T2 T3 E E T2 T2 E T3 E E T3 T1 T3 T1 E T3 
T1 T1 E T1 T1 T3 T3 T1 E T2 T3 T1 T3 T3 T3 E 
T3 T1 T1 T1 T2 T2 T3 T1 T3 T2 E T2 T1 E T1 E 
T3 E T2 E T1 T1 T3 T2 T3 T2 T3 E T3 T3 T2 T2 
T1 T1 E T3 T1 E T2 T1 T3 T1 T1 T2 T2 T2 T1 T2 
T3 E T3 T3 T3 T2 T1 T1 E E E T2 T1 T2 E T3 
T1 E T3 T2 E E T3 E E E T3 T1 E T2 T2 E 
LEVEL 2 
T2 T2 T3 T2 T1 T1 T3 T3 T1 E T1 T2 T3 T2 E T1 
T1 T3 T2 E T2 E T2 T2 T3 T1 T3 T1 E T3 T3 T3 
T3 T3 T3 E T3 T3 E T3 T1 T1 T1 T2 T2 T3 T2 T1 
T2 T3 T1 T2 T1 E E T2 T1 T1 T3 T2 E T1 T2 T3 
T2 T2 T3 E T3 T3 T1 T1 E T3 T3 T2 T3 E T1 E 
T2 T3 T3 T2 E E E T2 T1 T3 E T2 T1 T3 E T1 
T3 T3 E T1 E T3 T1 T1 T3 T3 E T3 E T3 T1 T2 
T2 E T1 E T1 T3 T1 T3 E T3 T1 E T1 T3 T1 E 
T3 E E T1 T3 T2 T2 E T3 T2 T2 T1 E T1 T2 T2 
T3 T3 E E T2 T1 T3 T1 E T3 E E E E T1 E 
T3 E E T2 E E T2 T1 T2 T1 T1 T2 T3 T2 T3 T1 
T3 E T2 T3 T1 T3 T3 T2 E T1 T2 T2 T2 T2 T1 E 
T2 T3 T1 T3 T2 T3 T2 T3 T1 T1 T3 T3 T2 T2 E T3 
T3 T3 T2 T3 T1 T3 T1 T1 T2 E E T3 E T1 T2 T2 
T1 T2 T2 T2 T1 T1 T1 E T1 T2 T2 E T1 T3 T1 T3 
E T2 E E T3 T3 E T1 T1 T2 E T1 T3 E T3 T3 
LEVEL 3 
T3 E T1 T3 T3 T3 T2 T3 T1 E T1 T1 T1 T2 E T1 
T1 E E T2 T1 T3 T1 E T1 T3 T3 T3 T3 T2 T1 T1 
T2 T3 T1 T2 T3 E T3 T1 T3 E T1 T3 T1 T2 E T3 
T1 T2 T1 E T2 T1 T1 T3 T2 T2 T2 T2 T3 T3 E T1 
T3 T2 T3 E T3 T1 T1 T2 E T2 E T3 T1 T1 E T1 
T3 E T2 T3 T2 E E T2 T1 E T1 E T2 E T3 T3 
E T2 T1 T3 E T1 E E T3 T1 T1 T3 T2 T1 E E 
T1 T3 T2 T3 T1 T2 T1 E T2 T3 T3 T1 T3 T2 T3 T2 
E T2 T1 T1 E T1 T2 T3 E T2 T1 T3 E T3 E T2 
T3 E T1 T3 T2 E T1 T1 E T2 T3 T3 T3 T2 E E 
T2 E E T2 T3 T3 T1 T2 T1 T2 T1 T3 T2 T2 T2 T2 
T1 E T2 T3 T2 E T2 T2 T1 T2 T1 E T2 E T2 T3 
T2 E T1 E E T1 T3 T1 E T1 E T1 T1 E T2 T2 
T2 T3 T3 T1 E T1 T1 E T1 T3 T3 T3 E T2 T2 E 
T2 T1 T1 T1 T2 E T1 T3 T3 T3 T2 E T3 E T2 E 
E T2 T1 T2 E T1 T3 T1 T3 T1 T3 T2 T1 T1 E T3 
LEVEL 4 
E E E T1 T2 T1 T1 E T1 T3 T2 E E T1 T3 T2 
T2 T2 E T3 T3 E E T1 T3 E E T1 T2 T3 T2 E 
T2 T3 T3 T3 T3 E T2 T2 T1 T1 T1 T2 T3 E T2 T1 
T2 T1 E T2 T3 T3 T3 E T1 T3 T2 T2 T2 T1 E T3 
T3 T2 T3 E T2 E T2 E T2 T1 T1 T3 E T2 E T2 
E T1 T1 T1 E E E T2 T1 T1 T3 T1 T2 E T3 T3 
E T3 E T1 E T2 T2 T1 T2 E T3 T3 T3 T1 T3 T3 
E T2 T1 T1 T2 T2 T3 E E T1 T3 T3 T3 T1 T2 E 
T3 T3 T2 E T3 T2 E T1 T2 E E T2 T2 T1 E E 
T3 E E T2 T3 T2 T1 T2 T3 T1 E T1 T3 T2 T1 T2 
E T2 T1 T2 T3 T2 E T3 T3 T1 E T3 T3 T3 T3 T1 
E T2 T1 T1 T1 T3 E T2 E T3 T1 T1 T2 T2 E E 
T3 T3 T3 T2 E T1 T1 T3 T3 T3 E T3 T3 T3 T1 T1 
T2 T1 T1 T2 E E E T3 T1 T3 T3 T1 E E T1 T2 
T1 T2 T2 E T2 T1 T3 T3 T1 T1 T2 T3 T3 T1 T2 T1 
T1 T2 T1 E T1 T3 T2 T1 T1 T2 E E T1 E T3 T1 
LEVEL 5 
T1 T1 T3 T1 T2 T3 E T2 T2 T1 T3 T2 T2 E T1 T1 
T3 E T3 E T2 T1 T1 T3 T2 T3 T1 T1 T3 T2 T3 T1 
T2 T3 T1 T2 T2 E T1 T3 E T2 T2 T2 T3 T3 T2 T2 
T1 E T1 T1 T2 T1 T3 E T3 E T1 T1 T3 T3 T1 T3 
T1 T1 T3 T2 T2 E E E E T2 E T1 T1 T2 E T2 
E T2 E E T3 E T1 E E T1 T3 T2 E E T2 E 
T2 T3 T3 E T3 T2 T2 T3 T1 E E E T3 T2 T3 T2 
T1 T1 T1 T1 E T2 E E T1 T3 T2 T1 T3 E E E 
T1 T1 E T1 T3 E E E T1 T1 T1 T3 T1 T2 T3 T3 
T2 T2 T3 T3 E T2 T1 T3 T2 T1 T3 T1 T1 T2 T3 E 
T3 T1 T3 T3 T3 E T1 T1 E T3 T2 E T2 T2 E T1 
T1 T3 E T1 T2 T2 T2 T2 T3 T3 E E T3 T1 T1 T2 
T1 E E T3 T2 T2 T1 T2 T2 T2 T2 T1 T3 T3 T3 E 
T3 E E T2 T1 T3 T1 T2 E E T3 E T3 T2 T1 E 
T1 T3 T1 T3 T2 E E T2 T2 T2 E T1 T2 E T1 T1 
T2 T3 T1 T3 T1 T1 T2 T2 E T1 T2 T1 T2 E E T1 
END OF MAZE 

當我與執行我的計劃上面的文件示例我得到此錯誤:

Error in `./a.out': corrupted double-linked list: 0x0000000001174280 *** 

下面是GDB回溯:

(gdb) backtrace 
#0 0x00007ffff7531cc9 in __GI_raise ([email protected]=6) 
    at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
#1 0x00007ffff75350d8 in __GI_abort() at abort.c:89 
#2 0x00007ffff756e394 in __libc_message ([email protected]=1, 
    [email protected]=0x7ffff767cb28 "*** Error in `%s': %s: 0x%s ***\n") 
    at ../sysdeps/posix/libc_fatal.c:175 
#3 0x00007ffff75790f7 in malloc_printerr (action=<optimized out>, 
    str=0x7ffff7678bfc "corrupted double-linked list", ptr=<optimized out>) 
    at malloc.c:4996 
#4 0x00007ffff757a7a7 in _int_free (av=0x7ffff78b9760 <main_arena>, p=<optimized out>, 
    have_lock=0) at malloc.c:3996 
#5 0x00007ffff7b898be in std::basic_filebuf<char, std::char_traits<char> >::_M_destroy_internal_buffer()() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#6 0x00007ffff7b89d47 in std::basic_filebuf<char, std::char_traits<char> >::close()() 
    from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#7 0x00007ffff7b8b3ad in std::basic_ifstream<char, std::char_traits<char> >::close()() 
    from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#8 0x00000000004018b9 in readFile(std::string)() 
#9 0x0000000000401a3d in main() 

我也看其他崗位有關的問題,這個電流和他們中的一些正要走出數組索引,但我有測試一切,我總是內部邊界。那麼我讀這個文件的方式有什麼問題? 我希望這不是一個愚蠢的問題。 在此先感謝。

+6

你應該避免成爲[三星程序員](http://c2.com/cgi/wiki?ThreeStarProgrammer) – NathanOliver

+0

感謝您的建議 – JKostikiadis

回答

4

你要出界:

stages = new string**[num_of_stages]; 
    for(int i = 0 ; i < N ; i ++) { 
     stages[i] = new string*[N]; 

如果num_of_stages < N您正在訪問過陣。

您應該使用std::vector而不是自己處理原始指針並使用new/delete。它有一個at函數可以進行邊界檢查。

+0

我在尋找更多文件讀取,而不是在數組初始化.. -_ - 感謝您的幫助和建議.. – JKostikiadis