如何在c中读取文件的多行

时间:2012-09-21 09:01:48

标签: c

我试图读取包含我的代码坐标值的文件。每次我使用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 );
    }
  }
}

6 个答案:

答案 0 :(得分:1)

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

另外,这个:

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

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

data[i][j] = d;

答案 1 :(得分: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
}

fscanf 返回读取值的数量时,您可以判断是否已达到EOF或文件编写错误

答案 2 :(得分:0)

尝试阅读换行符:

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

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

最后:

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

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

答案 3 :(得分:0)

如果你要去fscanf(),你必须要小心,因为你必须确保文件格式正确,并且确切的空格数如fscanf()中的读数。

我建议使用fgets()然后使用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];

答案 4 :(得分:0)

  1. 将数据[4] [5]声明为数据[5] [4]
  2. 修改循环    for(i = 0; i <5; i ++)
         {          fscanf(文件,“S(%d,%d)(%d,%d)”,&amp; a,&amp; b,&amp; c,&amp; 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);
      }
    

答案 5 :(得分: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 );
        }
      }
}