У меня (как всегда) возникают проблемы с записью и чтением из связанного списка. Тот факт, что он сохраняется в двоичном файле, меня конфисковывает. Я попытался закодировать простую программу, только с одной простой структурой с двумя переменными, и писать и читать ее на диск, просто чтобы проверить, не злоупотреблял ли я 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);
}
@qrrty Спасибо за ответ! 1. Таким образом, теоретически это можно решить с помощью '' fir = (struct solic *) malloc (sizeof (struct solic)); '' выделить узел '' fir'', правильно? 2. И это можно решить, назначив '' cur'' '' fir'', а затем перейдя через список. –
Точно. Обратите внимание, что здесь очень непопулярно использовать возвращаемое значение 'malloc()', поэтому я рекомендую вам использовать 'fir = malloc (sizeof (struct solic))', если только, чтобы избежать задержек со стороны людей, спорящих об этом. :-) –