根据文件中的数字创建新变量 - C

Create new variables based on number from file - C

我的任务是根据文件中的输入信息创建发票。

我一切正常,但这是基于我对输入文件中不同人的数量的先验知识(即 2 "customers" = 我制作了 2 个结构)。

我的问题是:如何获取给定的客户数量(在输入文件的第一行)并使用它来创建该数量的独立结构。

Example: I read in "2" from the first line, and create 2 structs.

Example: I read in "4" from the first line, and create 4 structs.

我知道这是一个非常简单的解决方案,使用某种循环,从第一行开始计数直到达到所述数字,但是我如何 create/initialize 新结构的正确数量?

我试过的一个例子是:

while(j<numOrders){
customer c[j];
j++;
}

使用当 j=2 然后 customer c2 将被创建的逻辑。我意识到这是不正确的,但我不确定如何解决这个难题。

这是我的其余代码,以便大家可以看到我到目前为止所做的事情:

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

typedef struct it{
    char name[15];
    float weight;
    float price;
}item;

typedef struct c{
    char first[10];
    char last[15];
    int numProducts;
    item itemList[10]; 
}customer;

//customer createCustomer(int numOrders, FILE *input);
int main(){


    FILE *input = fopen("invoice1.txt","r");

    int numOrders, i=0,j=0;
    customer c1,c2;
    item i1;

    fscanf(input,"%d",&numOrders);
    fscanf(input,"%s %s",&c1.first, &c1.last);
    fscanf(input,"%d",&c1.numProducts);
    printf("%d\n%s %s %d\n",numOrders, c1.first, c1.last,c1.numProducts);
        //while loop here
    while (i<c1.numProducts){
    fscanf(input,"%s %f %f", &c1.itemList[i].name, &c1.itemList[i].price, &c1.itemList[i].weight);
    printf("%s %.2f %.2f\n",c1.itemList[i].name,c1.itemList[i].price,c1.itemList[i].weight);
    i++;
    }

    fscanf(input,"%s %s %d",&c2.first, &c2.last,&c2.numProducts);
    printf("%s %s %d\n", c2.first, c2.last,c2.numProducts);

    while (j<c2.numProducts){
    fscanf(input,"%s %f %f", &c2.itemList[j].name, &c2.itemList[j].price, &c2.itemList[j].weight);
    printf("%s %.2f %.2f\n",c2.itemList[j].name,c2.itemList[j].price,c2.itemList[j].weight);
    j++;
    }

    //  c1 = createCustomer(numOrders, input);
    system("pause");
    return 0;
}

谢谢!!

您需要声明一个指向客户数组的指针。动态初始化会有所帮助。沿着这些线的东西:

customer *listOfCustomers;
fscanf(input,"%d",&numberOfCustomers);
listOfCustomers = (customer*)malloc(sizeof(customer)*numberOfCustomers);

然后您可以访问此 listOfCustomers 作为

int i=0;
while(i<numberOfCustomers){
    //Do Something with listOfCustomers[i]
}

如果您确定 numberOfCustomers 很小,您可以使用静态数组而不是指针。

#define N 50
customer listOfCustomers[N]

访问 listOfCustomers 的方法保持不变。

EDIT: How to use arrays in this case

使用我们上面写的循环,我们将其写为:

//we declare the pointer to customer c in the same manner as explained above.
customer *c;
fscanf(input,"%d",&numberOfCustomers);
c = (customer*)malloc(sizeof(customer)*numberOfCustomers);
while(i<numberOfCustomers){
    fscanf(input,"%s %s",&c[i].first, &c[i].last);
    fscanf(input,"%d",&c[i].numProducts);
    //while loop here
    int j=0;
    while (j<c[i].numProducts){
        fscanf(input,"%s %f %f", &c[i].itemList[j].name, &c1.itemList[j].price, &c[i].itemList[j].weight);
        j++;
    }
    i++
}
//Then for printing the customer information we use a similar loop
i=0;
while(i<numberOfCustomers){
    printf("FirstName: %s LastName: %s",c[i].first, c[i].last);
    int j=0;
    while (j<c[i].numProducts){
        printf(input,"%s %f %f", c[i].itemList[j].name, c1.itemList[j].price, c[i].itemList[j].weight);
        j++;
    }
    i++;
}

如果您需要更多详细信息,请随时询问。

您需要首先将输入作为客户数量,然后使用循环获取所有客户的信息并将它们存储在您想要的位置。