2017-02-25 17 views
1

我想讀取C文件並將字符存儲在字符的二維數組中。我的ROWSCOL是10,據我所知,我的循環應該爲每列和每行執行10次。所以我不認爲應該有任何未初始化的單元格。此外,我也搜索了類似的問題,他們都談論數組的初始化,因爲程序有時會遺漏出包含垃圾的空單元,但在我的情況下,它應該沒有這個問題,應該這樣嗎?使用fgetc將數據加載到2d數組中?

是我的代碼是這樣的:

for (row = 0; row < ROWS; row++) { 
    for (col = 0; col < COL; col++) { 
     int chtr = fgetc(fp); 
     if (chtr != '\n') { 
      grid[row][col] = chtr; 
     } 
    } 
} 

左一個是我的輸出,但它包含隨機字符,但是,我預期輸出應該像正確的:

My outputOutput expected

什麼可能導致這種行爲?

+0

它可能有\ r包機? \ n刪除它。如果它是\ n你沒有在網格[行] [colum]中放置任何東西,並在該位置獲得原始網格垃圾。 – Mquinteiro

+0

我檢查過,但它跳過一些單元格,所以我認爲它不是'\ r'。 @Mquinteiro – Saad

+0

那麼剛剛做到了這一點,當我檢查'\ r'字符時,它給出了錯誤的輸出。但是,當我確實減少單元格以防它是'\ n'字符時,它會給我正確的輸出。 @Mquinteiro – Saad

回答

3

問題是,你不是跳過換行符,而是如果你遇到換行符,你沒有更新地圖中的位置(它包含舊垃圾)。如果你有一個更復雜的地圖,你會看到另外,每行開始進一步的,也就是說,如果你的地圖是

@BCDEFGHIJK 
ABCDEFGHIJK 
ABCDEFGHIJK 
ABCDEFGHIJK 
ABCDEFGHIJK 
ABCDEFGHIJK 
ABCDEFGHIJK 
ABCDEFGHIJK 
ABCDEFGHIJK 
ABCDEFGHIJK 

你會看到:

@BCDEFGHIJK 
)ABCDEFGHIJ 
K#ABCDEFGHI 
JK.ABCDEFGH 

等等。

您可以循環,而不是直到fgetc返回非換行符:

int chtr; 

while ((chtr = fgetc(fp)) == '\n') { } 

// some extra error handling wouldn't hurt 
if (chtr == EOF) { 
    printf("Corrupted map file!\n"); 
    exit(2); 
} 

grid[row][col] = chtr; 
+0

您可能希望使用空塊或continue語句使'while'語句的空主體更加明顯。 – chqrlie

+0

我可能錯了,但是你沒有將任何參數傳遞給'fgetc'函數。 – Saad

+0

@Saad你是對的 –

相關問題