【问题标题】:Issues reading in file with fgetc C使用 fgetc C 读取文件时出现问题
【发布时间】:2014-03-26 21:06:08
【问题描述】:

所以我正在用 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 时,我得到了预期值;当我在循环内打印拼图[i][j] 时,我再次得到正常值。但是,当我之后查看我的拼图数组时,每个值都设置为 9;对于我的一生,我无法弄清楚为什么。是否存在我不知道的内存/范围问题?

【问题讨论】:

  • if (c != -38) { //-38 is newline 我非常怀疑 --> if (c != '\n') { ...} 还有puzzle[i][j] = c - 48; --> puzzle[i][j] = c - '0'; Btw if (c == '\n) break; 更清晰,更健壮,并且避免了嵌套。
  • 由于在您为文件中的每个字符、网格的每个单元格执行两个 for 循环时,文件中的最后一个字符恰好是 9...需要检查您的循环逻辑。
  • fgetc() 的返回值将是 0..UCHAR_MAX(通常为 255)或 EOF(通常为 -1)范围内的非负整数。在任何已知情况下都不会是 -38。
  • @Pillsy 代码中的编辑可能已经解决了问题,但不应该被批准。回滚是正确的操作。
  • @Taiki 错了。在fgetc() 的特定情况下,手册页明确指出它返回转换为unsigned char 或EOF 的字符的值。之所以如此,是因为EOF 总是否定的;这允许使用负字符的实现来处理这个问题 - 否则,EOF 可能会被错误地解释为有效字符。所以,fgetc() 总是返回一个正值,或者一个负常数表示EOF

标签: c fgetc


【解决方案1】:

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

您想将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`;
    }

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

【讨论】:

  • 你可以加强测试。在内循环中,如果字符不是数字,则为错误。在内循环之后(但在外循环结束之前),您可以读取下一个字符;如果不是换行符,则为错误。
  • 好主意。我绝对建议实施它们。但是,对于这个答案,我只打算解决原始问题而不添加功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多