用fgetc C读取文件的问题

时间:2014-03-26 21:06:09

标签: c fgetc

所以我在C中编写了一个并行化的数独解决方案检查器,但我似乎遇到了一个读取普通旧.txt文件的问题。

以下是要在文件中读取的代码:

FILE* fp = fopen(argv[1], "r");
if (fp == NULL) {
    printf("Cannot open file\n");
    return 1;
}

//Begin copying file using fgetc
int c;
while ((c = fgetc(fp)) != EOF) {
    for (int i = 0; i < PUZZLE_SIZE; ++i) {
        for (int j = 0; j < PUZZLE_SIZE; ++j) {
            if (c != -38) { //-38 is newline
                //puzzle is a global array of ints
                puzzle[i][j] = c - 48; //handles ASCII to int (1-9) conversion
            }
        }
    }
}
fclose(fp);

.txt文件如下:

534678912
672195348
198342567
859761423
426853791
713924856
961537284
287419635
345286179

当我打印c - 48时,我得到了预期值;当我在循环内打印puzzle [i] [j]时,我再次得到正常值。但是,当我随后查看我的益智数组时,每个值都设置为9;对于我的生活,我不能弄明白为什么。是否存在我不知道的记忆/范围问题?

1 个答案:

答案 0 :(得分:3)

基本上,您的程序所做的是:对于文件中的每个字符(while),将ALL(forfor)拼图条目设置为该字符。因此,所有条目都将包含文件的最后一个字符。

您希望将for循环放在外面,并为每个拼图条目读取一个字符:

for (int i = 0; i < PUZZLE_SIZE; ++i)
    for (int j = 0; j < PUZZLE_SIZE; ++j) {
        c = fgetc(fp);
        if (c == '\n')
            c = fgetc(fp); // get a new char if we hit a newline
         puzzle[i][j] = c - `0`;
    }

这假设文件中有足够的字符来填充拼图。