2011-08-27 240 views
0

我正在嘗試將我用Vim編輯的文本文件讀入數組。從文本文件讀入數組

該文本文件是30 * 50,由單個數字組成。我一直在瘋狂地試圖讓它工作,但我認爲我有問題,由於換行符。這是我一直在使用的:

Map::Map(char* filename) 
{ 
grid[30][50] = (0); 
string line; 
ifstream m_file(filename); 
if (m_file.is_open()) 
     { 
       while(m_file.good()) 
       { 
         for (int i = 0; i < 30; i++) 
         { 
         getline(m_file,line); 
           for (int k = 0; k < 50; k++) 
           { 
           int tnum = atoi(line.c_str()); 
           grid[i][k] = tnum; 
           } 
         } 
       } 
       m_file.close(); 
     } 
}; 

網格在頭文件中定義爲int grid [30] [50]。

我使用打印的代碼如下:

void display_room(int trid[30][50]) 
{ 
     for (int i = 0; i < 30; i++) 
     { 
       for (int k = 0; k < 50; k++) 
       { 
         mvprintw(i,k,"%d",trid[i][k]); 
       }; 
     }; 
}; 

調用地圖SMAP =地圖( 「testmap」)之後;

我只是試圖將單個數字的數字捕獲到數組中,並重新打印該數組(使用curses)。目前,它讀取testmap文件,並打印所有的零,不管testmap文件中有什麼。

+0

好的。問題。什麼問題? –

+0

當它打印數字時,它只打印全零。即使當我更改「testmap」文件中的數字時。 – syl

回答

1

如果我理解你的問題:您解析設置從整條生產線,其中只有一個數字應該是值...

int tnum = atoi(line.c_str()); 
grid[i][k] = tnum; 

翻譯數字(ASCII爲int /字節/ ...能以這種方式來完成:(也許需要一些鑄造)

grid[i][k] = line[k] - '0'; 

+0

'while(m_file.good())'應該是'if(...)'。否則for循環可能會運行幾次。檢查文件狀態應該在變量i的for循環中。 – erikH

+0

你對減零的建議一開始並不奏效,但我只是改變了一段時間,如果問題解決了!非常感謝你,我一直在爲這麼簡單的事情而奮鬥!當我使用cout時,相同的代碼可以正常打印,但當我使用curses庫時不會。我不確定發生了什麼變化。 – syl

0

在內部循環,你打電話atoi與該行的每一次的全部內容作爲。行長度爲50個字符,atoi無法將其轉換爲intint的最大可表示值爲2147483647,而您的編號可能大於此值)。當atoi失敗時,它將返回0

你想要的是將行的每個字符轉換爲int。類似的東西:

for (int i = 0; i < 30; i++) 
{ 
    getline(m_file,line); 
    for (int k = 0; k < 50; k++) 
    { 
     // The ASCII character of the digits 0 to 9 have 
     // successives values. 
     int tnum = line[k] - '0'; 
     grid[i][k] = tnum; 
    } 
} 
0

再次查看您的代碼。試試,看看什麼是真正的說,而不是你希望它說什麼

int tnum = atoi(line.c_str()); 

您明確希望該行改爲每五十號上依次行。但它並沒有這麼說。它試圖將整行行變成一個整數(並試圖做50次)。

因爲你的數字是個位數,你真正需要的東西要簡單得多

int tnum = line[k] - '0'; 

按說線[K]你每次都會得到一個不同的數字一輪循環(因爲K均時間增加一輪循環)。 - '0'位只是將字符轉換爲整數的一種技巧。看看你是否可以研究它是如何工作的。