我正在尝试将结构数组传递给函数,然后让该函数处理文件并用值填充结构数组。该文件是一个文本文件,包含:
Gates M 60
Jobs M 55
Jane F 45
这将填充数组的结构。例如person [0]应该包含Gates M 60。目前,我对该程序没有任何错误,但是它只是不会将文件处理到fscanf的结构中。我引用的结构有误吗?
我还想知道是否有一种方法可以使for循环适用于任何大小的结构数组-这意味着我可以用什么替换for循环中的“ 2”条件以使其不断填充足够大小的数组,直到没有足够的信息来处理?
#include <stdio.h>
struct Person
{
char lastname[30];
char gender;
unsigned int age;
};
int function(struct Person array[])
{
FILE *cfPtr;
if((cfPtr = fopen("C:\\Users\\Nick\\Desktop\\textfile","r"))==NULL)
{
printf("File cannot be opened");
}
else
{
for(int i=0;i<2;i++)
{
fscanf(cfPtr,"%10s %c %3d",&array[i].lastname,&array[i].gender,&array[i].age);
}
}
}
int main(void)
{
struct Person person[3];
function(&person[3]);
printf("%s %c %d\n",person[0].lastname, person[0].gender, person[0].age);
printf("%s %c %d\n",person[1].lastname, person[1].gender, person[1].age);
printf("%s %c %d\n",person[2].lastname, person[2].gender, person[2].age);
}
目前,我对该程序没有任何错误,但是它只是不会将文件处理到fscanf的结构中。我引用的结构有误吗?
您快到了,只错过了几件事:
for(int i=0;i<2;i++)
应该为for(int i=0;i<3;i++)
,因为您永远不会像现在那样读第三行。&
放下。即,将fscanf(cfPtr,"...",&array[i].lastname,...);
更改为fscanf(cfPtr,"...",array[i].lastname,...);
。字符串(即char lastname[30];
)已经是一个数组,按名称使用数组时,您实际上会在其第一个元素上获得一个指针,因此不需要&
。function(&person[3]);
)的调用是不正确的:&person[3]
表示您正在获取人员数组的第4个元素(无界)的地址。您需要传递的只是数组本身,即function(person)
。出于与上一个项目符号相同的原因。 int
?我还想知道是否有一种方法可以使for循环适用于任何大小的结构数组-这意味着我可以用什么替换for循环中的“ 2”条件以使其不断填充足够大小的数组,直到没有足够的信息来处理?
[一种方法,即使用类型为struct Person
的动态数组,并首先使用malloc
为其分配空间,然后在函数内部的每次迭代中调用realloc
。当然,您需要对已读取的对象/线数保持计数。您可以通过关注this或this SO问题,或者在C中搜索和阅读有关动态数组的信息,找到有关所问问题的更多信息。