Первый узел переназначен новые данные читаются в - PullRequest
0 голосов
/ 03 апреля 2019

Я создал linked list, теперь я пытаюсь прочитать данные из файла, однако каждый раз, когда новая запись читается и присваивается структуре, первый узел переназначается и удаляет данные из предыдущей записи.Я хотел бы узнать, почему мой код делает это.

/* read file containing database of employees */
static void read_employee_database(char *file_name)
{
    char Name[MAX_NAME_LENGTH] = "\0";
    int Age;
    char Sex;
    char Job[MAX_JOB_LENGTH] = "\0";
    char ptr[10];
    char temp[100];
    int test = 0, count = 0;
    /*assigns enough memory*/
    Employee *pNewStruct = (Employee *)malloc(sizeof(Employee));



    FILE *pFile;    

    pFile = fopen(file_name, "r");
    while (feof(pFile) == 0) {
        fprintf(stderr, "\nFirst node name %s\n\n", pFirstNode->name);


        read_string(pFile, "Name: ", Name, MAX_NAME_LENGTH);
        strcpy(pNewStruct->name, Name);
        read_string(pFile, "Sex: ", temp, 4);
        Sex = temp[0];
        pNewStruct->sex = Sex;
        read_string(pFile, "Age: ", temp, 100);
        Age = atoi(temp);
        pNewStruct->age = Age;
        read_string(pFile, "Job: ", Job, MAX_JOB_LENGTH);
        strcpy(pNewStruct->job, Job);

        fprintf(stderr, "The name is: %s \n", Name);
        fprintf(stderr, "The Age is: %i \n", Age);
        fprintf(stderr, "The Sex is: %c \n", Sex);
        fprintf(stderr, "The Job is: %s \n", Job);
        fprintf(stderr, "\n");

        fgetc(pFile);
        /*Test all data for given entry*/
        test = checkName(&pNewStruct->name);
        if (test == 0) {
            fprintf(stderr, "Name is issue");
            exit(-1);
        }
        else if (pNewStruct->sex != 'M' && pNewStruct->sex != 'F') {
            fprintf(stderr, "Sex is issue");
            exit(-1);
        }
        else if (pNewStruct->age <= 0) {
            fprintf(stderr, "Age is issue");
            exit(-1);
        }
        else if (strlen(pNewStruct->job) == 0) {
            fprintf(stderr, "Job is issue");
            exit(-1);
        }
        else {

            if (pFirstNode->name == NULL) {
                fprintf(stderr, "a new node is created\n\n");
                pNewStruct->next = NULL;
                pNewStruct->prev = NULL;
                pFirstNode = pNewStruct;
            }
            else {
                fprintf(stderr, "Else statement run\n\n");
            }
        }
    }

    fclose(pFile);
}

На данный момент в коде я только ожидаю, что первый узел будет назначен, учитывая, что "pFirstNode" это public variable, чтоэто NULL.Однако новейшая запись, которая считывается автоматически, устанавливается как pFirstNode, хотя условие оператора if не выполняется.

Фактический вывод:


First node name (null)

The name is: Graham, Billy
The Age is: 63
The Sex is: M
The Job is: Evangelist

a new node is created


First node name Graham, Billy

The name is: Karula, Roger
The Age is: 23
The Sex is: M
The Job is: Engineer

Else statement run


First node name Karula, Roger

The name is: Smart, Lisa
The Age is: 18
The Sex is: F
The Job is: Trainee engineer

Else statement run

Я использую Ubuntuесли это важно.

1 Ответ

1 голос
/ 03 апреля 2019

Первому узлу переназначены новые данные читаются в

Вы выделяете только один Сотрудник , поэтому вы все время переписываете в нем, вам нужно выделить одиндля каждой ячейки

Employee *pNewStruct = (Employee *)malloc(sizeof(Employee));

необходимо переместить в в то время как , например сразу после

read_string(pFile, "Name: ", Name, MAX_NAME_LENGTH);

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

In

       if (pFirstNode->name == NULL) {
           fprintf(stderr, "a new node is created\n\n");
           pNewStruct->next = NULL;
           pNewStruct->prev = NULL;
           pFirstNode = pNewStruct;
       }

add pLastCell = pNewStruct;

В

        else {
           fprintf(stderr, "Else statement run\n\n");
       }

вам необходимо связать другие ячейки:

  pLastCell->next = pNewStruct;
  pNewStruct->prev = pLastCell;
  pLastCell = pNewStruct;
  pNewStruct->next = NULL;

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

Например:

while (read_string(pFile, "Name: ", Name, MAX_NAME_LENGTH))

и read_stringвозвращает 0 в EOF / ошибка

Удалить fprintf(stderr, "\nFirst node name %s\n\n", pFirstNode->name); бессмысленно

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