使用fgetc将数据加载到2d数组中?
问题描述:
我想读取C文件并将字符存储在字符的二维数组中。我的ROWS
和COL
是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;
}
}
}
左一个是我的输出,但它包含随机字符,但是,我预期输出应该像正确的:
什么可能导致这种行为?
答
问题是,你不是跳过换行符,而是如果你遇到换行符,你没有更新地图中的位置(它包含旧垃圾)。如果你有一个更复杂的地图,你会看到另外,每行开始进一步的,也就是说,如果你的地图是
@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;
它可能有\ r包机? \ n删除它。如果它是\ n你没有在网格[行] [colum]中放置任何东西,并在该位置获得原始网格垃圾。 – Mquinteiro
我检查过,但它跳过一些单元格,所以我认为它不是'\ r'。 @Mquinteiro – Saad
那么刚刚做到了这一点,当我检查'\ r'字符时,它给出了错误的输出。但是,当我确实减少单元格以防它是'\ n'字符时,它会给我正确的输出。 @Mquinteiro – Saad