2

我正在尝试读取包含我的代码坐标值的文件。每次我使用 scanf 它只读取第一行...(60,70,200,200)。我的问题是如何让我的代码读取我文件的所有内容并将其打印在屏幕上。这是我的代码和文件。

 FILE.txt:
   S (60,70)(200,200)
   S (30,40)(100,200)
   S (10,20)(80,10)
   S (60,400)(700,200)
   S (160,70)(240,20)

 MY CODE:
 #include <stdio.h>
 int a;
 int b;
 int c;
 int d;
 int data[4][5];

int main ( int argc, char *argv[] )
 {

if ( argc != 2 ) /* argc should be 2 for correct execution */
{
    /* We print argv[0] assuming it is the program name */
    printf( "usage: %s filename", argv[0] );
}
else 
{
    // We assume argv[1] is a filename to open
    FILE *file = fopen( argv[1], "r" );

    /* fopen returns 0, the NULL pointer, on failure */
    if ( file == 0 )
    {
        printf( "Could not open file\n" );
    }
    else 
    {
       int i,j;
      for (j=0; j < 5; j++) 
       {
         for (i=0; i < 4; i++) {  
         fscanf(file, "S (%d,%d)(%d,%d)", &a, &b, &c, &d);
           data[i][j] = (a, b, c, d);              
           printf("%d,%d,%d,%d\n",a, b, c, d);
          }
      }             

        fclose( file );
    }
  }
}
4

6 回答 6

1

必须检查 I/O 调用的返回值,例如fscanf(). 如果失败,它将返回 0 而不会更改您的变量。

另外,这个:

data[i][j] = (a, b, c, d); 

在 C 中没有多大意义。请记住,C 没有像 Python 那样的元组。以上等价于:

data[i][j] = d;
于 2012-09-21T09:05:13.527 回答
0

使用while循环:

const int NumberOfValuesIamGoingToReadAtOnce = 4;

while (fscanf(file, "S (%d,%d)(%d,%d)", &a, &b, &c, &d) == NumberOfValuesIamGoingToReadAtOnce)
{
    // do some actions with obtained values
}

as通过返回值fscanf 返回读取值的数量,您可以判断是否达到EOF或文件错误写入

于 2012-09-21T09:08:35.517 回答
0

尝试阅读换行符:

 fscanf(file, "S (%d,%d)(%d,%d)\n", &a, &b, &c, &d);

但为什么是双循环:您已经同时读取了 4 个值。相反,让它成为一个无限循环并检查您是否已经读取了 4 个值;当您没有读取 4 个值时中断。

最后:

   data[i][j] = (a, b, c, d);

没有任何意义(任何体面的编译器警告都会告诉你)。相反,这可能是您想要第二个循环的地方:围绕分配,而不是 scanf 语句。

于 2012-09-21T09:08:47.207 回答
0

如果你打算这样做fscanf(),你必须小心,因为你必须确保文件格式正确,并且具有准确的空格数,例如在 fscanf() 中的读取方式。

我建议使用fgets()then 从字符串中读取数字sscanf()

data[i][j] = (a, b, c, d);

这条线没有做你认为它做的事情。当您一次读取一行中的所有数字时,您真的不需要另一个循环。

   for (j=0; j < 5; j++) 
       {
         fscanf(file, "S (%d,%d)(%d,%d)", &a, &b, &c, &d);
           data[j][0] = a;
           data[j][1] = b;
           data[j][2] = c;
           data[j][3] = d;

           printf("%d,%d,%d,%d\n",a, b, c, d);
          }
      }             

并更改data[4][5]data[5][4];

于 2012-09-21T09:10:04.880 回答
0
  1. 将数据[4][5] 声明为数据[5][4]
  2. 修改循环 for (i=0; i < 5; i++)
    { fscanf(file, "S (%d,%d)(%d,%d)", &a, &b, &c, &d);

         data[i][0] =a;
         data[i][1] =b;
         data[i][2] =c;
         data[i][3] =d;
         printf("%d,%d,%d,%d\n",a, b, c, d);
      }
    
于 2012-09-21T09:14:59.880 回答
0

我曾经fgets每行读取文件行,我用sscanf而不是fscanf

#include <stdio.h>
#include <string.h>

int data[4][5];
char line[128];

int main ( int argc, char *argv[] )
{

    if ( argc != 2 ) /* argc should be 2 for correct execution */
    {
        /* We print argv[0] assuming it is the program name */
        printf( "usage: %s filename", argv[0] );
    }
    else
    {
        // We assume argv[1] is a filename to open
        FILE *file = fopen( argv[1], "r" );

        /* fopen returns 0, the NULL pointer, on failure */
        if ( file == 0 )
        {
            printf( "Could not open file\n" );
        }
        else
        {
           int i=0;
           line[0] = 0;
           while(fgets(line,sizeof(line),file))
            {
               sscanf(line, "S (%d,%d)(%d,%d)", &data[i][0], &data[i][1], &data[i][2], &data[i][3]);
               printf("%d,%d,%d,%d\n", data[i][0], data[i][1], data[i][2], data[i][3]);
               i++;
            }
            fclose( file );
        }
      }
}
于 2012-09-21T10:31:17.337 回答