Этого определения структуры, что я пытаюсь писать копии и читать из двоичного файлаКак устранить ошибку сегментации при чтении/записи в двоичный файл в C
typedef struct carType Car;
struct carType {
int vehicleID;
char make[20];
char model[20];
int year;
int mileage;
double cost;
Car *next;
};
Это мой код для записи двоичный файл (состояние автомобиля)
void writeBinFile(Car *headPointer)
{
char fileName[20];
//prompt user for name of textfile to print to
scanf("%s", fileName);
FILE *ftp;
Car *start = headPointer->next;
ftp = fopen(fileName, "wb");
char separator = '0';
while(start != NULL)
{
//write out 1 cell of data, cell contains 4 bytes
fwrite(&start->year,sizeof(int), 1, ftp);
fwrite(start->make,sizeof(char), strlen(start->make), ftp);
fwrite(&separator, sizeof(char), 1, ftp);
fwrite(start->model, sizeof(char), strlen(start->make), ftp);
fwrite(&separator, sizeof(char), 1, ftp);
fwrite(&start->cost, sizeof(float), 1, ftp);
fwrite(&start->mileage, sizeof(float),1,ftp);
fwrite(&start->vehicleID, sizeof(int), 1, ftp);
start = start->next;
}
fclose(ftp);
}
Это мой код для чтения из двоичного файла (для состояния автомобиля)
void readFromBinFile(Car *headPointer)
{
char fileName[20];
//prompt user for name of textfile to print to
scanf("%s", fileName);
FILE *ftp;
Car *previous = headPointer;
ftp = fopen(fileName, "rb");
Car *current;
//go until the end of file is reached
while(!feof(ftp))
{
current = (Car *)malloc(sizeof(Car));
previous->next = current;
//program receives 1 cell, that cell contains 4 bytes
fread(¤t->year, sizeof(int),1,ftp);
printf("%d\n",current->year);
char make[25];
int count = 0;
char oneAtATime= 'a';
while(oneAtATime != '0')
{
fread(&oneAtATime, sizeof(char),1,ftp);
if(oneAtATime!='0')
{
make[count] = oneAtATime;
count++;
}
}
make[count] = 0;
strcpy(current->make, make);
char model[25];
count = 0;
oneAtATime= 'a';
while(oneAtATime != '0')
{
fread(&oneAtATime, sizeof(char),1,ftp);
if(oneAtATime!='0')
{
model[count] = oneAtATime;
count++;
}
}
model[count] = 0;
strcpy(current->model, model);
fread(¤t->cost, sizeof(float),1, ftp);
fread(¤t->mileage, sizeof(int),1,ftp);
fread(¤t->vehicleID, sizeof(int),1,ftp);
previous = previous->next;
}
fclose(ftp);
}
В прошлый раз я получил ошибку сегментации, не выделяя память новому автомобилю Why am I getting a segmentation failure?. На этот раз я сделал это. Я проверил этот Segmentation fault when reading a binary file into a structure и Segmentation fault while reading binary file in C, но мои поля были значениями, а не указателями. Кто-нибудь видит вопиющую проблему? Я не могу проверить что-либо bc всякий раз, когда я пытаюсь запустить это, я получаю эту ошибку. Проблема заключается в чтении, но я не уверен, что какой-то код в записи вызывает сбой чтения.
Вы не записали терминатор нулевого символа для своих строк (strlen не включает это). На самом деле вам лучше писать 'sizeof' свои массивы, записывая все 20 байтов. Таким образом, каждая из ваших записей данных будет иметь тот же размер, и вы можете обращаться к ним напрямую, а не последовательно (если хотите). – ooga
Я сделал терминатор, хотя с этой строкой. model [count] = 0; – committedandroider
ooga я бы, но разве нехорошо быть под впечатлением, что вы не знаете, как долго будет строка? – committedandroider