c - 使用 fgetc 将数据加载到二维数组中?

标签 c arrays file char

我正在尝试读取 C 中的文件并将字符存储在二维字符数组中。我的 ROWSCOL 是 10,据我所知,我的循环应该为每一列和每一行执行 10 次。所以我认为不应该有任何未初始化的单元格。我也搜索过类似的问题,他们都在谈论数组的初始化,因为程序有时会遗漏包含垃圾的空单元格,但就我而言,它不应该有那个问题,不是吗?

我的代码是这样的:

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

左边一个 是我的输出,但它包含随机字符,但是,我的预期输出 应该像右边那个:

My output Output expected

是什么导致了这种行为?

最佳答案

问题是你没有跳过换行符,相反,如果你遇到换行符,你没有更新 map 中的那个位置(它包含旧垃圾)。如果您有一个更复杂的 map ,您还会注意到每一行都开始得更远,即如果您的 map 是

@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;

关于c - 使用 fgetc 将数据加载到二维数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42461291/

相关文章:

c - 反虚拟机的定时检查效果不佳?

c - {int i=999; 怎么样? char c=i;} 不同于 {char c=999;}?

c - 如何简化复合否定逻辑

javascript - 将单个对象提取为一个对象,而不是作为一个对象的数组,Javascript

linux - 如何根据文件的创建时间删除文件?

c - Islower功能故障

javascript - 突出显示数组中的单词

arrays - $firebaseArray 中的 For 循环

用于检测文件在不同运行之间是否发生变化的 Python 库?

linux - 如何将 Unix 'Top' 命令输出捕获到 CSV 文件?