【问题标题】:How do I scan certain characters from a file如何扫描文件中的某些字符
【发布时间】:2015-02-11 21:14:19
【问题描述】:

我目前正在研究数独验证器,我这样做的方法是将每一行分成一个长度为 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 个值,因此它的行为不会像它想要的那样。

谁能给我一个建议,我该如何实现它?我认为这是相当微不足道的,但我很难理解它。

谢谢

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

【问题讨论】:

  • 您必须检查您是否真的在扫描这些值,简而言之检查fscanf()的返回值。

标签: c arrays file scanf


【解决方案1】:

因为它是一个数独验证器,所以创建一个 9 * 9 2D 数组并像您正在做的那样逐行读取。然后逐行或逐列循环以验证您的数独方块。

// 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声明移到函数开头(循环外)。

【讨论】:

  • 首先,您的fscanf() 错误,其次您修复它时会出错,因为您不检查它的返回值,这是有原因的,您不觉得吗?
  • 错过了FILE 指针。我的错。 cmets中也提到了代码是如何被限制的。
  • 你没有想到 c++ 编译器,有时他们在不知道 c++ != c 的情况下使用它们。
  • 我想 C++ 编译器应该编译 for 循环内的变量声明就好了?
  • 是的,我就是这个意思。
【解决方案2】:

使用简单的过滤器,避免所有计数和跳过并作为单个字符读取。毕竟,您只对从 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随机挑选的例子)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多