如何扫描文件中的某些字符

时间:2015-02-11 21:14:20

标签: c arrays file scanf

我目前正在研究一个数独验证器,我这样做的方法是将每一行分成长度为9的数组并检查,将每列分成长度为9的数组并检查等等。我已经完成了行已经做了类似的事情

         for( i=0; i<9; i++)
        fscanf(file, "%1d", &row1[i]);
          for( i=0; i<9; i++)
        fscanf(file, "%1d", &row2[i]);
          for( i=0; i<9; i++)
        fscanf(file, "%1d", &row3[i]);
          for( i=0; i<9; i++)
        fscanf(file, "%1d", &row4[i]);

它的工作方式也是我想要的。

我的数独搜索解决方案中的每个数字都被水平空格隔开,并且在我的文件中垂直相邻。

但是,我在尝试将每列扫描到数组时遇到问题。基本上我认为我需要做的是第一列开始于第一个(左上角)字符并将其存储到我的数组的第一个插槽中。然后我需要跳过9个字符,然后存储该字符。

我以为我可以做类似

的事情
         for( i=0; i<82; i += 9)
        fscanf(file, "%1d", &col1[i]);
          for( i=1; i<82; i+=9)
        fscanf(file, "%1d", &col2[i]);
          for( i=2; i<82; i+=9)
        fscanf(file, "%1d", &col3[i]);
          for( i=3; i<82; i+=9)
        fscanf(file, "%1d", &col4[i]);
          for( i=4; i<82; i+=9)

但我意识到它没有用,因为我已经将我的数组设置为9号,因为我插入数组中的第i个值,这样就不会像它想要的那样。

任何人都可以给我一个如何实现这个的建议吗?我认为这是相当微不足道的,但我在缠绕它时遇到了严重的麻烦。

由于

编辑:我还需要为该地区执行此操作,因此我基本上寻找一种方法来跳过文件并仅存储我想要的某些字符。

2 个答案:

答案 0 :(得分:3)

因为它是一个数独验证器,所以创建一个9 * 9的二维数组,并像你一样读取行。然后以行方式或列方式循环以验证您的数独方块。

// As pointed out in comments, this code assumes you have a minimum of 9*9 separated ints with width = 1.
// If not, you need to check whether fscanf failed or not.
int sudoku[9][9] ;
for(int i = 0; i < 9; ++i)
    for(int j = 0; j < 9; ++j)
        fscanf(file_ptr, "%1d", &sudoku[i][j]); /* Check for the return value 
                                                 * of fscanf if it is not
                                                 * guaranteed that there 
                                                 * will always be 81 elements 
                                                 * to read from or some other 
                                                 * error occurred while 
                                                 * reading the file.
                                                 */

// now use sudoku to verify.
for(int i = 0; i < 9; ++i)
    for(int j = 0; j < 9; ++j)
    {
        // sudoku[i][j] is row wise.
        // sudoku[j][i] is column wise.
    }

我假设您正在使用C99或更高版本的编译器。如果是C89,则需要在函数开头(循环外)移动int iint j声明。

答案 1 :(得分:0)

使用简单的过滤器躲避所有计数和跳过并读取为单个字符。毕竟,您只对从19的81位数感兴趣,总是以正确的顺序显示 - 无论其他格式或新的内容是什么地点。如果您还为未知单元格添加了0.,则可以阅读此类格式

1..|...|7..
.2.|...|5..
6..|38.|...
-----------
.78|...|...
...|6.9|...
...|...|14.
-----------
...|.25|..9
..3|...|.6.
..4|...|..2

还有这个

000605000003020800045090270500000001062000540400000007098060450006040700000203000

(从http://www.sudocue.net/fileformats.php中随机选取的例子)