我一直在尝试使用文件中的字符串填充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
只是一个名单,这都是
这是输出:
答案 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++)