将文本文件读入2D数组

时间:2014-05-10 06:17:31

标签: c arrays file-io multidimensional-array

所以目前我有一个能够读取包含9x9板的文本文件的工作代码,2D阵列中的每个插槽都是1-9之间的数字;但是,有些插槽会随机混入一个“ - ”字符。我发现我能够成功读取所有行然后打印它们的唯一方法是使用char sudoku[9][9],但这极大地影响了我当前作业的其他部分。

文件应该是连续9行,如下所示:

123-56-89
4561-3--9

等...

有人能告诉我一种方法,我可以成功地将文本文件内容扫描成INTEGER 2D数组而不是char数组吗?

int main(){
 int i, j;
 char sudoku[9][9];
    char filename[100];

        printf("Please enter file name (W/O .txt): ");
        scanf("%s", filename);

        FILE *file1 = fopen(filename, "r");

        for(i=0;i<9;i++){
            for(j=0;j<9;j++){
                fscanf(file1,"%c\t", &sudoku[i][j]);
            }
        }

        for(i=0;i<9;i++){
            for(j=0;j<9;j++){
                printf("%2c", sudoku[i][j]);
                }
            printf("\n");
        }

fclose(file1);
}

2 个答案:

答案 0 :(得分:2)

int suduku[9][9];

for (int i = 0; i < 9; i++)
{
    for (int j = 0; j < 9; j++)
    {
        char c;
        if (fscanf(file1, " %c", &c) != 1)
            …report read failure and exit…
        else if (isdigit((unsigned char)c))
            sudoku[i][j] = c - '0';
        else
            sudoku[i][j] = 0;
    }
}

将字符读入字符,然后转换为适当的整数。请注意,代码不关心矩阵中的每个字符是否与下一个字符分开十几个空白行,并且字符前面有20个空格,或者整个输入是单行上的81个字符,还是任何其他变体。只要文件中至少有81个非空格字符,就可以了。

答案 1 :(得分:0)

#include <stdlib.h>
/* ... */
int sudoku[9][9];
/* ... */
for(i = 0; i < 9; i++) {
    for(j = 0; j < 9; j++) {
        char s[] = "0";
        fscanf(file1, " %c", &s[0]);
        sudoku[i][j] = atoi(s);
    }
}

我更喜欢在可能的情况下调用标准库函数来执行整数转换。在这里,我正在使用atoi()。如果它看到一个数字,它将返回其整数值。如果看到任何其他内容,包括' - '字符,它将返回0.如果fscanf()用完字符,atoi()也将返回0(因为我们在每次迭代中将s初始化为“0”),用' - '字符填充数组的其余部分。 (请注意,s在技术上是字符串而不是字符,因为这是atoi()期望的输入,但fscanf()只会覆盖存储字符的第一个字节。)