Почему мой File.dat не может быть прочитан и запущен и как я могу присвоить данные структуре?- С - PullRequest
0 голосов
/ 09 декабря 2018

ВЫПУСК: Я новичок в C и даже новее в structs, когда я пытаюсь просто распечатать свои данные в файле beer.dat, у меня появляется ошибка иЯ знаю, что не правильно читаю, но как я могу сохранить свои данные в моем Struct после правильной потоковой передачи файла?

Для полной ясности я опубликую вопросы о назначении ... Назначениеэто:

  1. Поиск пива должен запросить у пользователя идентификационный номер, а результат должен отобразить его количество и цену, если они есть в вашем инвентаре.
  2. ВидВесь инвентарь будет отображать все пиво с их идентификационным номером, ценой и количеством в порядке возрастания цены.Эта сортировка должна выполняться с использованием рекурсивного пузыря или рекурсивного выбора.
  3. При оформлении заказа на экран должна быть распечатана накладная заказа.

ПивоСодержимое файла .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

КОД:

#include "beer.dat" //loading required file... in other news - making groundbreaking comments like this because I'm forced to, stay tuned!
#include <stdio.h> // including the thing
#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;

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");
    scanf("%d", &user_choice);

    while (user_choice != 4) {
        switch (user_choice) {
            case 1:
                printf("Searching for a beer\n");
                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;
        }
    }


}

void search() {
    //look through beer.dat for a specific beer by ID number.

    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 ", fp);
            //printStr(fp);
        }


    }

    fclose(fp);
}

void printStr(char *line) {
    printf("%s\n", line);
}

ПЕРВОНАЧАЛЬНЫЕ ОШИБКИ: Компилятор дает мне,

In file included from C:\Users\me\CLionProjects\work\main.c:32:0:
C:\Users\me\CLionProjects\work\beer.dat:1:1: error: expected identifier or '(' before numeric constant
 7
 ^
C:\Users\me\CLionProjects\work\beer.dat:27:1: error: invalid digit "9" in octal constant
 0890398
 ^~~~~~~

Я очень ценю любую помощь, которую вы можете оказать.Я нахожусь в середине большого эпизода депрессии, и из-за этого мне очень трудно понять эту новую концепцию.Это последнее задание семестра.Еще раз, я искренне благодарю вас за внимание к этой проблеме.Не просят выполнить задание, конечно !!

1 Ответ

0 голосов
/ 09 декабря 2018

Вы хотите, чтобы ваша программа считывала данные с beer.dat, когда она выполняется.Файл не содержит код, который является частью вашей программы.Компилятор говорит вам, что он не знает, как интерпретировать содержимое файла как часть программы на Си.

Поэтому удалите строку #include "beer.dat".

Файл открывается и читается позже в search с fopen и fscanf.

Вы также по-прежнему пропускаете предварительное объявление для search.Либо поместите функцию search перед main, либо добавьте объявление, подобное

void search();

перед main, чтобы компилятор знал, какие аргументы search принимает и что возвращает, когда вы вызываете еев main.

Включение некоторых дополнительных предупреждений с помощью -Wall -Wextra также говорит нам, что

<source>: In function 'search':
<source>:58:26: warning: format '%s' expects argument of type 'char *', but argument 3 has type 'FILE *' {aka 'struct _IO_FILE *'} [-Wformat=]
             fscanf(fp, "%s ", fp);
                         ~^    ~~
<source>:58:13: warning: passing argument 1 to restrict-qualified parameter aliases with argument 3 [-Wrestrict]
             fscanf(fp, "%s ", fp);
             ^~~~~~

, потому что вы пытаетесь прочитать из файла, что обработчик fp (первый аргумент) ссылается, и вы указываете fscanf сохранить прочитанную строку в том месте, куда указывает обработчик файла fp (третий аргумент).Конечно, это не имеет никакого смысла, вы хотите сохранить его в некотором массиве char.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...