Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
fscanf()读取错误_C_File Io_Scanf - Fatal编程技术网

fscanf()读取错误

fscanf()读取错误,c,file-io,scanf,C,File Io,Scanf,我有一个文本文件,我正在把名字和姓氏读入一个大小为20的字符数组。我正在创建一个结构数组,它保存“人的”信息。 文本文件如下所示: John Robbins Teresa Jones 我的结构定义如下: struct people { char name[20]; }; 人事声明结构: struct people *persons[2]; 在声明了一个新结构后,我读入了带有以下代码的名称: for(i=0; i<2; i++) { fscanf(dp, "%[^\n]s

我有一个文本文件,我正在把名字和姓氏读入一个大小为20的字符数组。我正在创建一个结构数组,它保存“人的”信息。 文本文件如下所示:

John Robbins
Teresa Jones 
我的结构定义如下:

struct people {

char name[20];
};
人事声明结构:

 struct people *persons[2];
在声明了一个新结构后,我读入了带有以下代码的名称:

for(i=0; i<2; i++)
{  
  fscanf(dp, "%[^\n]s", &persons[i].name[20]);
}
我做了大量的研究,找不到解决这个问题的办法。有没有人遇到过这个问题

fscanf(dp, "%[^\n]s", &persons[i].name[20]);
这会将该行读到一个换行符,然后尝试读取一个将失败的
s
。换行前的行将存储在人员结构中
名称
数组的末尾(这意味着它将覆盖到
人员
数组的下一个元素中)

你想要的是:

fscanf(dp, " %19[^\n]%*[^\n]", persons[i].name);
相反--初始空格跳过前导空格(包括前一行中的任何换行符)。
%19[^\n]
最多读取19个字符或一个换行符并存储它,后跟一个终止NULL(因此将使用整个20字节
名称
数组,但不会更多)。
%*[^\n]
将读取换行符之前(不包括换行符)行中的任何附加字符并将其丢弃

您还需要检查
fscanf
调用的返回值,以确保不会出现错误或文件结尾:

#define MAX_PEOPLE    2
struct people persons[MAX_PEOPLE];

i = 0;
while (i < MAX_PEOPLE && fscanf(dp, " %19[^\n]%*[^\n]", persons[i].name) > 0)
    i++;
#定义最大人数2
结构人员[最大人员];
i=0;
而(i0)
i++;
这会将该行读取到一个换行符,然后尝试读取一个将失败的
s
。换行符将存储在人员结构中
name
数组的末尾(这意味着它将覆盖到
persons
数组的下一个元素中)

你想要的是:

fscanf(dp, " %19[^\n]%*[^\n]", persons[i].name);
相反--初始空格跳过前导空格(包括前一行中的任何换行符)。
%19[^\n]
最多读取19个字符或一个换行符并存储它,后跟一个终止NULL(因此将使用整个20字节
名称
数组,但不会更多)。
%*[^\n]
将读取换行符之前(不包括换行符)行中的任何附加字符并将其丢弃

您还需要检查
fscanf
调用的返回值,以确保不会出现错误或文件结尾:

#define MAX_PEOPLE    2
struct people persons[MAX_PEOPLE];

i = 0;
while (i < MAX_PEOPLE && fscanf(dp, " %19[^\n]%*[^\n]", persons[i].name) > 0)
    i++;
#定义最大人数2
结构人员[最大人员];
i=0;
而(i0)
i++;

请显示person数组的声明。刚刚添加了“Persons”结构的声明是否只是一个拼写错误,您在声明中大写了Persons,但在使用它时却没有?是的,这只是一个拼写错误,您的代码甚至没有编译。Persons[i]不是结构而是指向结构的指针。请显示person数组的声明。只是添加了“Persons”结构的声明。这只是一个拼写错误,您在声明中大写了Persons,但在使用它时却没有。是的,这只是一个拼写错误,您的代码甚至没有编译。Persons[i]不是结构,而是指向结构的指针。根据发布的
persons
声明,它应该是
persons[i]->name
。是的,他需要将声明更改为
struct people[2];
或者他拥有的代码甚至不会编译。将其作为一个指针数组也需要为其分配空间。根据发布的
persons
声明,它应该是
name
。是的,他需要将声明更改为
struct people[2]
或者他拥有的代码甚至无法编译。将其作为指针数组也需要为其分配空间。