Я работал над этим заданием, где мне нужно прочитать «записи» и записать их в файл, а затем иметь возможность прочитать / найти их позже. При каждом запуске программы пользователь может решить записать новую запись или прочитать старую запись (по имени или #)
Файл является двоичным, вот его определение:
typedef struct{
char * name;
char * address;
short addressLength, nameLength;
int phoneNumber;
}employeeRecord;
employeeRecord record;
Как работает программа, она будет хранить структуру, затем имя, затем адрес. Имя и адрес распределяются динамически, поэтому сначала необходимо прочитать структуру, чтобы найти размер имени и адреса, выделить для них память, а затем прочитать их в этой памяти.
На данный момент у меня есть две программы для отладки. У меня есть программа для записи файлов и чтения файлов.
Моя настоящая проблема заключается в следующем: когда я читаю файл, который я написал, я читаю в структуре, распечатываю телефон #, чтобы убедиться, что он работает (работает нормально), а затем перечитываю имя (теперь могу используйте record.nameLength, который также сообщает правильное значение).
Fread, однако, не возвращает пригодного имени, он возвращает пустое.
Я вижу две проблемы: либо я неправильно записал имя в файл, либо неправильно прочитал.
Вот как я пишу в файл: где fp - указатель файла. record.name - правильное значение, как и record.nameLength. Также я пишу имя, включая нулевой терминатор. (например, «Джек \ 0»)
fwrite(&record,sizeof record,1,fp);
fwrite(record.name,sizeof(char),record.nameLength,fp);
fwrite(record.address,sizeof(char),record.addressLength,fp);
И тогда я закрываю файл.
вот как я читаю файл:
fp = fopen("employeeRecord","r");
fread(&record,sizeof record,1,fp);
printf("Number: %d\n",record.phoneNumber);
char *nameString = malloc(sizeof(char)*record.nameLength);
printf("\nName Length: %d",record.nameLength);
fread(nameString,sizeof(char),record.nameLength,fp);
printf("\nName: %s",nameString);
Обратите внимание, что там есть некоторые отладочные материалы (длина и номер имени, оба из которых являются правильными). Итак, я знаю, что файл открыт правильно, и я могу использовать длину имени в порядке. Почему тогда мой вывод пуст, или перевод строки, или что-то в этом роде? (Вывод - просто Имя: после него ничего не происходит, и программа просто завершается)
Спасибо за помощь.