Я пытаюсь выполнить простую запись и чтение двоичного файла на c, и у меня возникают трудности. Вот мой код настолько урезан, насколько я мог его сделать:
typedef struct car_struct{
char* make;
char* model;
short year;
long price;
int uniqueID;
}Car;
int main(){
FILE *fp = fopen("filename", "wb+");
Car car = {"s","s",1,1,1};
fwrite(&car, sizeof(Car), 1, fp);
rewind(fp);
Car* c;
fread(c,sizeof(Car),1,fp);
printf("%d \n",c->price);
}
Я думал, что код запишет структуру в файл, затем прочитает ее и распечатает одно из ее полей. Фактический результат, однако, заключается в том, что программа завершается без печати вообще. Кажется, что где-то закралось неопределенное поведение, но я не уверен, где. В чем проблема с кодом?
Вы просто записываете значения указателя для строк, а не для самой строки. Либо сделайте make
и model
чем-то вроде char[32]
, чтобы они действительно были в структуре, либо напишите свои собственные процедуры чтения / записи.
Также не забывайте проверять результаты всех операций ввода-вывода - это может помочь понять другие проблемы.
Хотя вы правы, поле, которое я пытаюсь прочитать, имеет тип long, поэтому я не думаю, что это может быть источником проблемы. Пожалуйста, объясните, если я ошибаюсь
Проблема в строке Car* c;
. Вы создали указатель, указывающий на какой-то случайный адрес. Вы можете определить размер памяти, которую вы хотите, чтобы c
удерживал, используя malloc(sizeof(Car))
.
Вы пытаетесь считать в область памяти, которая не была выделена. Я удивлен, что у вас нет segfault. Вам должно быть удобно получать значение указателя в программном пространстве, что может привести к сумасшедшему повреждению неопределенной программы.