fscanf没有读入数组

时间:2015-04-13 19:50:20

标签: c arrays scanf

我一直在尝试使用文件中的字符串填充struct数组,但fscanf不会这样做。代码编译得很好,但是当我测试它时(如果数组实际被填充),没有任何东西出来,好像什么也没做。

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

    typedef struct p{
        char name[21];
        char lname[21];
    } Person;

    int main() {

    FILE *in;
    Person array[100];
    int i, n;

    in=fopen("people.txt", "r");

    if (in == NULL ) {
       fprintf(stderr, "Failed to open\n");
       exit(EXIT_FAILURE);
    }

    n=0;

    while( fscanf(in, "%s %s", array[n].name, array[n].lname) != EOF) 
        n++;
*// Here I've tried even with >0 or  == 2, nothing worked) //* 


    fclose(in);


    for (i=0;i<n;i++)
        printf("%s %s\n", array[i].name, array[i].lname);

    return 0;
    }

这是.txt文件:

Steven Stevenson 
Mark Ronson 
Jeff Jefferson 
Kyle Roger

只是一个名单,这都是

这是输出:

Notice the black space inbetween

3 个答案:

答案 0 :(得分:1)

我运行了这个程序,运行正常。我用几个名字创建了一个people.txt。每行的名字和姓氏用一个空格分隔。

您可能想要检查输入文件的格式。 fscanf可能希望名称和姓氏只用一个空格分隔。

答案 1 :(得分:0)

除了错误的评论语法,我没有看到任何明显错误。您最好的选择是逐行运行调试器并随时检查结果。你正在使用gcc构建一个linux系统,所以这应该很简单:

$ gcc -g -o mk mk.c
$ gdb mk
(gdb) break main    
(gdb) r             
(gdb) n             

break main在程序输入时设置断点,r启动程序,n逐行逐步执行程序。您可以使用p命令在程序执行时打印不同项的值:

(gdb) p n
(gdb) p array[n].name
(gdb) p array[n].lname

从现在开始,这应该是您的程序没有按预期执行时所做的第一件事。

如果您不想弄乱调试器(gdb不是世界上最好的,但它真的不是那么难用),那么请更改您的代码,以便将进度记录为你读了你的输入文件,如下所示:

int itemsRead;
...
while ( (itemsRead = fscanf( ... )) != EOF )
{
  fprintf( stderr, "Expecting 2 items, read %d\n", itemsRead );
  switch( itemsRead )
  {
    case 2:
      fprintf( stderr, "array[%d].lname = %s\n", n, array[n].lname );
    case 1:
      fprintf( stderr, "array[%d].name  = %s\n", n, array[n].name );
    default:
      break;
  }
  if ( itemsRead < 2 )
    break;

  n++;
}

如果没有别的,它应该让你知道问题出在哪里。如果itemsRead返回少于2,那么您可能会遇到文件格式化问题。

答案 2 :(得分:-1)

*// Here I've tried even with >0 or  == 2, nothing worked) //* 

不是有效评论 和

for (i=o;i<n;i++)

是一个错字。我想你的意思是:

for (i=0;i<n;i++)