2017-02-25 48 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你是对的 –