如何利用结构数组根据用户输入输出给定结构

时间:2018-12-09 01:48:05

标签: c file pointers struct

问题::我尝试用在beerData中找到的数据填充struct beer.dat,但我不了解结构如何足够好地工作实现而不会崩溃我的代码。我相信我需要一系列结构。

beer.dat文件内容:

7 // total number of beers 
Coors //beer name
1234567 // beer id
72 // beer quantity
7.40 //beer price 
Miller
7777777
44
9.70
Bud
7654321
345
9.90
Wachusett
7799435
4
14.70
Corona
9999999
112
9.99
Zima
0000000
1
0.01
Mikes
0890398
12
10.99

代码:

/*
    User interface, alloc, malloc 13 points
    Correct structure and array built 7 points
    Recursive sort
 */

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

struct beerData {
    char *beer[7]; // number of brands

    char *beer_name; //names
    int beer_id[7]; //ID number given to beer
    int beer_quantity; //stock
    float beer_price; // pricing
} beer_data;


void printStr(char *line) {

    char *look = "";
    printf("What would you like to search for? \n");
    scanf("%s", look);

    //printf("Line: %s\n", line);


    exit(0);
}

void search() {
    //look through beer.dat for a specific beer by ID number.
    char str[32];

    FILE *fp = fopen("beer.dat", "r");

    if (fp == NULL) {
        printf("Error: can't open file to read\n");
    } else {
        while (!feof(fp)) {
            fscanf(fp, "%s ", str);
            //printf("%s\n",str);
            printStr(str);
        }

    }

    fclose(fp);
}


int main() {

    int user_choice;
    printf("Enter 1 to search for a beer, 2 to view the entire catalogue,"
           " and 3 to place an order, press 4 to exit.\n");


    while (user_choice != 4) {
        scanf("%d", &user_choice);
        switch (user_choice) {

            case 1:
                printf("Searching for a beer\n");
                user_choice = 0;
                search();
                break;
            case 2:
                printf("Viewing Inventory\n");
                //viewInv();
                break;
            case 3:

                printf("Placing an order...\n");
                //placeOrder();
                break;
            case 4:
                printf("Goodbye!\n");
                exit(0);
            default:
                printf("Incorrect entry, try again.\n");
                continue;
        }
    }


}

我正在尝试创建一个搜索文件的功能,并根据给定的ID查找特定的啤酒,该ID位于应作为其结构的集合内...因此,一旦输入ID,该程序搜索啤酒,并打印出名称,编号,数量和价格。

为清晰起见,我将发布作业问题,以防我不能正确传达需求。任务是:

  1. 搜索啤酒应提示用户输入ID号,并且结果应显示其数量和价格(如果您的库存中有此价格)。
  2. 整个库存视图将按价格升序显示所有啤酒及其ID号,价格和数量。应该使用“递归冒泡”或“递归选择”排序来完成此排序。
  3. 下订单时,应将订单的发票打印到屏幕上。

1 个答案:

答案 0 :(得分:1)

首先,您需要声明一个有意义的结构。该结构包含每个项目的相关信息。示例:

typedef struct beer_data 
{
    char name[20]; //names
    int id; //ID number given to beer
    int quantity; //stock
    float price; // pricing
} beer_data;

接下来,您需要此结构的数组。使用malloctotal个项目分配足够的内存。示例:

beer_data *beers = malloc(total * sizeof(beer_data));

现在您有了beers[0], beers[1], beers[2]...,读取文件中的每一项并将其放入结构中。

要读取文件,可以使用fscanffgets

文件的第一行是

7 // total number of beers 

您可以使用7来读取数字fscanf

int maximum = 0;
fscanf(fp, "%d", &maximum);

这应该可以正常工作,但是后面有一些您不需要的字符。使用fgets读取到行尾并丢弃这些字符。

开始循环并读取每一行,然后添加到结构中。

使用这种方法,如果要添加新项目,则必须增加内存大小。请参见使用add_item的{​​{1}}。这可能太先进了。或者,您可以将新项目保存到文件中,调用realloc,然后再次读取文件。

free(beers)