Я создал 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если это важно.