Как прочитать CSV-файл в связанном списке структуры в c - PullRequest
0 голосов
/ 18 января 2020

Я новичок здесь и в программировании в целом (обратите внимание, администраторы и гуру программирования на go легко для меня, спасибо), и я делаю домашнее задание для школы в c о небольшой программе, которая читает CSV-файл в односвязный список, где данные представляют собой структуру, затем отображает их, сортирует и записывает в текстовый файл и т. д. c ..

проблема, с которой я сейчас сталкиваюсь, заключается либо в функция чтения или функция отображения: в результате данные либо читаются, либо отображаются в обратном порядке, а одна строка сдвигается вниз.

Я некоторое время стучал по ней головой, но сейчас у меня заканчивается время, и я подумал спросить его здесь, может быть, чтобы получить какой-то отзыв от свободных sh глаз. В качестве ссылки прилагается скриншот содержимого файла для чтения и вывода программы (очевидно, поскольку я новый пользователь, я не могу загрузить фотографию непосредственно на сайт ..) заранее спасибо

вот соответствующие строки кода:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <conio.h>
#include <string.h>


// DEFINE
#define CSV_FILE_TO_READ "TPP_TP_Data_2019_base.csv"


// ============================
// GLOBAL VARIABLES


struct node
{
    char Name[50];
    char Firstname[50];
    char Initials[10];
    char Mobile[30];
    char Class[50];
    char InitialSort[50]; // change into int
    char RandomSort[50];  // change into float

    struct node *next;
} *head;


// ============================
// FONCTION PROTOTYPE DECLARATIONS

void Read();
void Display();


// ============================
// MAIN

int main()
{

    Read();
    Display();


    return 0;
}

// ============================
// FUNCTIONS

void Read()
{

    FILE *fPointer;
    fPointer = fopen(CSV_FILE_TO_READ,"r");

    if (fPointer == NULL)
    {
        printf("\nCould not open file %s",CSV_FILE_TO_READ);
        return;
    }

    //reading the file and creating liked list

    char parsedLine[100];
    while(fgets(parsedLine, 100, fPointer) != NULL)
    {
        struct node *node = malloc(sizeof(struct node));

        char *getName = strtok(parsedLine, ";");
        strcpy(node->Name, getName);

        char *getFirstname = strtok(NULL, ";");
        strcpy(node->Firstname, getFirstname);

        char *getInitials = strtok(NULL, ";");
        strcpy(node->Initials, getInitials);

        char *getMobile = strtok(NULL, ";");
        strcpy(node->Mobile, getMobile);

        char *getClass = strtok(NULL, ";");
        strcpy(node->Class, getClass);

        char *getInitialSort = strtok(NULL, ";");  // change function into int getter
        strcpy(node->InitialSort, getInitialSort);

        char *getRandomSort = strtok(NULL, ";");  // change function into a float getter
        strcpy(node->RandomSort, getRandomSort);


        node->next = head;
        head = node;

    }

    fclose(fPointer);
}




void Display()  // displays the content of the linked list
{
    struct node *temp;
    temp=head;
    while(temp!=NULL)
    {
        printf("%s %s %s %s %s %s %s \n",temp->Name,temp->Firstname,temp->Initials,temp->Mobile,temp->Class,temp->InitialSort,temp->RandomSort);
        temp = temp->next;
    }
    printf("\n");
    printf("===========================================");

}

вывод программы

1 Ответ

0 голосов
/ 18 января 2020

Вы создаете свой список как стек , потому что вы добавляете каждый новый узел в начало списка. Чтобы получить правильный порядок, вам нужно добавить в конец (хвост) списка.

Вы можете сделать это, отслеживая последний узел в списке (он нужен только вам) в функции Read). Первоначально head и tail равны, если бы в списке был только один узел, и заголовок, и хвост списка были бы одинаковыми.

После добавления первого узла каждую итерацию вы tail->next укажите на созданный вами новый узел и установите tail равным новому узлу.


Если вы не уверены в его работе, я предлагаю вам использовать ручку и некоторые бумаги и использовать его, чтобы нарисовать список и все операции над ним. Используйте квадраты в качестве узлов и стрелки в качестве ссылок (или указателей в целом).

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