Итак, по какой-то причине мне нужно создать внешний файл (.DAT) для хранения данных, добавив новый в конец старых данных.
#include <stdio.h>
#include <stdlib.h>
int main () {
typedef struct {
char *Name;
int Index;
} DataFile;
static FILE *file;
size_t result;
DataFile *DataTable;
file = fopen("database.DAT","ab");
DataTable = (DataFile *) malloc (sizeof(DataFile));
DataTable[0].Name = "somefile.txt";
DataTable[0].Index = 7;
printf("%s %d \n",DataTable[0].Name,DataTable[0].Index);
result = fwrite(DataTable,sizeof(DataFile),1,file);
fclose(file);
free(DataTable);
return 0;
}
После запуска приведенного выше кода я проверяю, правильно ли сохранены данные. Итак, я делаю этот код ниже.
#include <stdio.h>
#include <stdlib.h>
int main () {
typedef struct {
char *Name;
int Index;
} DataFile;
static FILE *file;
size_t result;
long size;
int i;
DataFile *DataTable;
file = fopen("database.DAT","rb");
if (file == NULL) printf("Error1");
// Determine the size of file
fseek(file,0,SEEK_END);
size = ftell(file);
rewind(file);
DataTable = (DataFile *) malloc ((size/sizeof(DataFile)) * sizeof(DataFile));
if (DataTable == NULL) printf("Error2");
result = fread(DataTable,sizeof(DataFile),size/sizeof(DataFile),file);
fclose(file);
for (i=0; i<result; i++) {
printf("%s %d \n",DataTable[i].Name,DataTable[i].Index);
}
free(DataTable);
return 0;
}
Однако он дает вывод
somefile.txt 7
из первого блока кода и
Error1 7
из второго блока кода. Я замечаю, что проблема не в том, что сбой либо при открытии файла .DAT, либо при выделении памяти для DataTable. Кроме того, он работает для типа int (индекс), но не для типа char* (имя) при чтении из файла .DAT. Я понятия не имею, что делать, чтобы решить эту проблему чтения типа char * (и откуда берется «error1»). (даже гугл не дает мне ответа.)
DataTable = (DataFile *) malloc (sizeof(DataFile));
лучше писать какDataTable = malloc(sizeof *DataTable);
. Не переводите возвращаемое значениеmalloc()
в C и не повторяйтесь без необходимости. - person unwind   schedule 15.11.2012