Top.Mail.Ru
Ответы

Почему данные с файла считываются некорректно?

В файле хранятся имя-пол-возраст, необходимо занести данные из файла в двусвязный список. Код работает, если в файле один человек. Если в файле инфа по двум человекам, вывод зацикливается, видимо теряется NULL, который указывает на конец при выводе...Но не понимаю, где я его теряю?

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
 #include <stdio.h> 
#include <stdlib.h> 
 
typedef struct data{ 
    char name[16]; 
    char sex[16]; 
    int  age; 
}dataT; 
 
typedef struct node{ 
    dataT* data; 
    struct node* next, *prev; 
}node; 
 
typedef struct hwnd{ 
    size_t size; 
    node*  head, *tail; 
}hwnd; 
 
hwnd* createHwnd(); //создание дискриптора списка 
void unloadData_FromFile(FILE*,hwnd*); 
void showList(node*); //вывод 
void uploadList(node*, hwnd*); 
 
int main(int agrc, char** argv) 
{ 
    char s[16]; int x; 
    hwnd* hwnd = createHwnd(); 
    FILE* file = fopen("vector", "wb+"); 
 
    gets(s);    //ввод имени 
    fwrite(s, sizeof(char), 16, file); 
    gets(s);    //ввод пола 
    fwrite(s, sizeof(char), 16, file); 
    scanf("%d", &x); getchar(); //возраст 
    fwrite(&x, sizeof(int), 1, file); 
 
    unloadData_FromFile(file, hwnd);//считывание файла в вектор 
 
    showList(hwnd->head); 
 
 //   clearMemory(hwnd); 
    fclose(file); 
    return 0; 
} 
 
void unloadData_FromFile(FILE* file, hwnd* hwnd)  
{ 
    int x; char s[16]; 
    rewind(file); 
 
    dataT* pData = (dataT*)malloc(sizeof(dataT)); //память под данные узла 
    node* temp = (node*)malloc(sizeof(node)); //память под узел 
 
    while(fread(pData->name, sizeof(char), 16, file)) //считываем имя 
    { 
        fread(pData->sex, sizeof(char), 16, file); //считываем пол 
        fread(&pData->age, sizeof(int), 1, file); //считываем возраст 
         
        temp->data = pData; //копируем адрес структуры в поле для данных 
        uploadList(temp, hwnd); //добавляем узел в вектор 
    } 
} 
 
void uploadList(node* temp, hwnd* hwnd) 
{ 
    temp->prev = hwnd->tail; 
    temp->next = NULL; 
    if (hwnd->tail) 
        hwnd->tail->next = temp; 
    else 
        hwnd->head = temp; 
    hwnd->tail = temp; 
} 
 
void showList(node* head) 
{ 
    int id = 0; 
    puts("|ID|   NAME   |  SEX  | AGE |"); 
    while(head) 
    { 
        printf("|%2d|%10s|%7s|%5d|\n", id++, head->data->name, head->data->sex, head->data->age); 
        head = head->next; 
    } 
    return; 
} 
 
hwnd* createHwnd() 
{ 
    hwnd* temp = (hwnd*)malloc(sizeof(hwnd)); 
    temp->head = NULL; 
    temp->tail = NULL; 
    temp->size = 0; 
    return temp; 
}  
По дате
По рейтингу
Аватар пользователя
Искусственный Интеллект

А для каких целей считывание структуры делается по-элементно?
fread(pData, sizeof(DataT), 1, file)

Аватар пользователя
Мудрец

хз