Использование fgets и strtok для чтения данных и создания связанного списка

Нужна помощь с чтением строк данных из текстового файла с помощью команд fgets и токенизации строк, которые затем будут использоваться для создания связанного списка. Я следил за некоторыми примерами, которые нашел на Stack Overflow и других обучающих веб-сайтах, но до сих пор не могу заставить функцию чтения, указанную ниже, работать должным образом в моей программе, это просто приводит к ее сбою. В файле данных есть такие строки:

Кабачки, кабачки, фунты, 2,19, 45
Желтый, кабачки, фунты, 1,79, 15

Судя по всему, что я прочитал, я считаю, что у меня есть необходимый код, но, очевидно, что-то мне не хватает. Кроме того, я закомментировал одно из полей (одно для цены с плавающей запятой), поскольку я не уверен, что использовать для копирования значения с плавающей запятой из данных, поскольку я не могу рассматривать его как строку (целочисленное значение прямо под ним кажется чтобы позволить мне избавиться от этого в моем компиляторе).

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

// Struct for linked list node
struct produceItem
{
    char produce[20];
    char type[20];
    char soldBy[20];
    float price;
    int quantityInStock;
    struct produceItem *next;
};

// Function to read in data from file to
void read(struct produceItem **head)
{
    struct produceItem *temp = NULL;
    struct produceItem *right = NULL;

    //char ch[3];
    char line[50];
    char *value;

    FILE *data = fopen("RecitationFiveInput.txt", "r");

    printf("Trying to open file RecitationFiveInput.txt\n");

    if (data == NULL)
    {
        printf("Could not open file RecitationFiveInput.txt\n");
    }
    else
    {
        while(fgets(line, sizeof(line), data))
        {
            value = strtok(line, ", ");
            strcpy(temp->produce, strdup(value));

            value = strtok(NULL, ", ");
            strcpy(temp->type, strdup(value));

            value = strtok(NULL, ", ");
            strcpy(temp->soldBy, strdup(value));

            //value = strtok(NULL, ", ");
            //strcpy(temp->price, strdup(value));

            value = strtok(NULL, " \n");
            strcpy(temp->quantityInStock, strdup(value));

            temp->next = NULL;

            if (*head == NULL)
            {
                *head = temp;
            }
            else
            {
                right = *head;

                while(right->next != NULL)
                {
                    right = right->next;
                }

                right->next = temp;
            }

        }

        printf("Successfully opened file RecitationFiveInput.txt\n");
    }

    fclose(data);

    return;
}

// Function to display the nodes of the linked list that contains the data from the data file
void display(struct produceItem *head)
{
    int value = 1;

    struct produceItem *temp = NULL;

    temp = head;

    printf("=============================================================================\n");
    printf(" Item #   Produce          Type          Sold By          Price      In Stock\n");
    printf("=============================================================================\n");

    if(temp == NULL)
    {
        return;
    }
    else
    {
        while(temp != NULL)
        {
            printf(" %d   %s          %s          %s          %lf      %d\n", value, temp->produce, temp->type, temp->soldBy, temp->price, temp->quantityInStock);
            value++;

            temp = temp->next;

            if(temp == NULL)
            {
                break;
            }
        }
    }
    return;
}

//Main function
int main()
{
    int input = 0;

    struct produceItem *head = NULL;

    while(1)
    {
        printf("\nList Operations\n");
        printf("=================\n");
        printf("1. Stock Produce Department\n");
        printf("2. Display Produce Inventory\n");
        printf("3. Reverse Order of Produce Inventory\n");
        printf("4. Export Produce Inventory\n");
        printf("5. Exit Program\n");
        printf("Enter your choice: ");

        if(scanf("%d", &input) <= 0)
        {
            printf("Enter only an integer.\n");
            exit(0);
        }
        else
        {
            switch(input)
            {
                case 1:
                    read(&head);
                    break;
                case 2:
                    display(head);
                    break;
                case 3:
                    //function
                    break;
                case 4:
                    //function
                    break;
                case 5:
                    printf("You have exited the program, Goodbye!\n");
                    return 0;
                    break;
                default:
                    printf("Invalid option.\n");
            }
        }
    }

    return 0;
}

person Minhaz M    schedule 10.07.2015    source источник


Ответы (1)


Не обращайте внимания на всех, нашел проблему. Сбои были из-за того, что я не выделял память для временного указателя в функции чтения.

person Minhaz M    schedule 15.07.2015