2013-12-12 21 views
0

У меня (как всегда) возникают проблемы с записью и чтением из связанного списка. Тот факт, что он сохраняется в двоичном файле, меня конфисковывает. Я попытался закодировать простую программу, только с одной простой структурой с двумя переменными, и писать и читать ее на диск, просто чтобы проверить, не злоупотреблял ли я fread() или fwrite(). Однако я не был. Программа прошла гладко. Проблема начинается, когда я начинаю добавлять указатели и узлы в связанный список. Я проверил stackoverflow.com, cplusplus.com, cprograming.com, и, как я вижу, моя программа не имеет ничего плохого. Пробовал отлаживать, ничего. Компилятор вообще не жалуется.Связанные записи для записи и чтения

Источник, который я привел ниже, очень прост: содержит структуру с двумя переменными, именем и кодом, например, Clients Control. Код предоставляется автоматически программой, и пользователь вводит имя. Затем программа должна сохранять данные и продолжать работу. Однако он не проходит мимо задания fir->sacode = 1. Любые советы были бы весьма признательны.

#include <stdio.h> 

void save(void); 
int load(void); 

struct solic { 
    char name[10]; 
    int sacode; 
    struct solic *next; 
}; 

struct solic *cur, *fir; 
int sacode = 1; 

int main() 
{ 
    if(load() == 0) 
     printf("Load Successful!\n"); 

    char cho1; 
    fir->sacode = 1; 
    cur=fir; 
    while(1){ 
     cur->sacode = sacode; 
     printf("Client code is %04d",cur->sacode); 
     printf("Enter client name: "); 
     scanf("%s",cur->name); 
     save(); 
     printf("Saved!\n"); 
     printf("Press '1' to enter another client, or 'Enter' to save and exit.\n"); 
     scanf("%c",&cho1); 
     if(cho1 == '1') 
     { 
      cur->next = (struct solic *)malloc(sizeof(struct solic)); 
      cur = cur->next; 
      sacode++; 
      cur->sacode = sacode; 
      continue; 
     } 
     else if(cho1 == '\r'); 
      break; 
    } 

    return(0); 
} 

void save(void) 
{ 
    FILE *pFile; 
    pFile = fopen("db.dat","w"); 
    while(cur != NULL) 
    { 
     fwrite(cur->name,sizeof(cur->name),1,pFile); 
     fwrite(&cur->sacode,sizeof(int),1,pFile); 
     cur = cur->next; 
    } 
    fclose(pFile); 
} 

int load(void) 
{ 
    int size; 
    char buffer[10]; 

    FILE *pFile; 
    pFile = fopen("db.dat","r"); 
    if(pFile == NULL) 
     return(1); 

    size = fseek(pFile,0,SEEK_END); 
    rewind(pFile); 
    cur = fir; 

    while(size >= ftell(pFile)) 
    { 
     fread(cur->name,sizeof(cur->name),1,pFile); 
     fread(buffer,sizeof(int),1,pFile); 
     cur->sacode = atoi(buffer); 
     sacode++; 
     cur->next = (struct solic *)malloc(sizeof(struct solic)); 
     cur = cur->next; 
    } 
    cur->next = NULL; 
    return(0); 
} 

ответ

2
  1. Первый раз, когда вы запустите эту программу, load() потерпит неудачу, потому что нет никаких данных. Это означает, что fir не будет инициализирован, поэтому fir->sacode = 1 попытается обновить некоторое случайное местоположение в памяти. Прежде чем хранить что-либо в fir, вам нужно будет присвоить ему новый узел malloc().

  2. Функция save() записывает новый файл db.dat каждый раз, когда он запускается, начиная с указателя cur. Но каждый раз, когда он вызывается, cur указывает на последний элемент в списке. Вам нужно будет либо открыть этот файл для добавления, так что он не записывает никаких данных, которые уже есть, или просматривает весь список.

+0

@qrrty Спасибо за ответ! 1. Таким образом, теоретически это можно решить с помощью '' fir = (struct solic *) malloc (sizeof (struct solic)); '' выделить узел '' fir'', правильно? 2. И это можно решить, назначив '' cur'' '' fir'', а затем перейдя через список. –

+0

Точно. Обратите внимание, что здесь очень непопулярно использовать возвращаемое значение 'malloc()', поэтому я рекомендую вам использовать 'fir = malloc (sizeof (struct solic))', если только, чтобы избежать задержек со стороны людей, спорящих об этом. :-) –

Смежные вопросы