学习处理文件,尝试通过引用fcn传递结构数组

问题描述 投票:2回答:1

我正在尝试将结构数组传递给函数,然后让该函数处理文件并用值填充结构数组。该文件是一个文本文件,包含:

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);
}
c arrays structure
1个回答
1
投票

目前,我对该程序没有任何错误,但是它只是不会将文件处理到fscanf的结构中。我引用的结构有误吗?

您快到了,只错过了几件事:

  • [for(int i=0;i<2;i++)应该为for(int i=0;i<3;i++),因为您永远不会像现在那样读第三行。
  • 用scanf读取并存储在字符串中时,将&放下。即,将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。当然,您需要对已读取的对象/线数保持计数。您可以通过关注thisthis SO问题,或者在C中搜索和阅读有关动态数组的信息,找到有关所问问题的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.