【问题标题】:fgetc() doesn't work properlyfgetc() 不能正常工作
【发布时间】:2012-06-07 12:06:26
【问题描述】:

我有类似 7 4 5 1 等的文件。我想将这些数字放入多维数组中。

for(x=0;x<9;x++)
       for(y=0;y<9;y++)
       {
         current=fgetc(fp);
         if(current!=EOF&current!=' '&current!='\n')
              sudokuArray[x][y] = current-'0';
       }

此代码无法正常工作。 sudokuArray[0][0] 给出的结果为真(文件中的第一个数字),但 [0][1] 给出了一些随机数,如 131231304。[0][2] 给出了 [0][1] 应该是什么。这是为什么呢?

【问题讨论】:

  • 我认为你应该交换“for x”和“for y”循环。顺便说一句,我缺少电流的定义。另外:你想要&&,而不是&。您应该添加一个 else 子句,将数组设置为某个特殊值,例如零或 -1。
  • sudokuArray 是如何定义的? current 是如何定义的?

标签: c multidimensional-array eof fgetc


【解决方案1】:

这是因为如果你的内循环:

for(y=0;y<9;y++)
{
    current=fgetc(fp);
    if((current!=EOF) && (current!=' ') && (current!='\n'))
        sudokuArray[x][y] = current-'0';
}

如果您的输入是7 4 5 1,那么当您输入y == 0 时,您会读取'7',它会被放入sudokuArray[0][0]

现在在你的下一个循环中,y == 1,你读到了' '。由于您的 if 声明,您没有将其放入 sudokuArray y 仍然会增加

下次你循环时,y == 2,你读到'4',它会被放入sudokuArray[0][2]

所以fgetc() 确实可以正常工作,并且您的代码完全按照您的要求执行。这样代码就很听话了。

编辑:还要注意您的if 语句应包含&amp;&amp; 而不是&amp;。他们是不同的运营商。一些空格和一些括号也使代码更易于阅读和维护。

【讨论】:

    【解决方案2】:

    我不确定你为什么使用嵌套循环来读取文件。我在您的代码中发现了一个问题:

    将 & 改为 &&:

         if(current!=EOF&current!=' '&current!='\n')
    

    到:

     if(current!=EOF && current!=' ' && current!='\n')
    

    &amp;&amp; 是逻辑 AND&amp; 是按位与。

    因为,你只有整数,而且你似乎知道确切的数字。整数。你可以简单地使用fscanf:

    fscanf(fp, "%d", &arr[x][y]);
    

    【讨论】:

      【解决方案3】:

      在您的循环中,您忽略了字符 - 但是即使您没有填充相关的数组元素,您也会增加索引。尝试重新实现为:

      #include <stdlib.h>
      
      for(x=0;x<9;x++)
          for(y=0;y<9;y++)
            {
            /* Get next character */
      
            current=fgetc(fp);
      
            /* Loop, retrieving additional chars, until either EOF is hit or 
               you find a non-whitespace character */
      
            while(current != EOF && iswhite(current))
              current = fgetc(fp);
      
            if(current != EOF)
              sudokuArray[x][y] = current - '0';
            }
      

      另外 - 你想检查current != EOF,还是应该是!feof(fp)

      分享和享受。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-30
        • 2010-11-30
        • 2021-10-02
        • 2017-08-06
        • 2013-11-22
        • 1970-01-01
        • 2013-09-10
        • 2017-04-05
        相关资源
        最近更新 更多