【发布时间】:2014-10-25 23:48:43
【问题描述】:
这是我试图写入和读取二进制文件副本的结构定义
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,但我的字段是值,而不是指针。 有没有人看到一个明显的问题?每当我尝试运行它时,我都无法测试任何东西,我得到了那个错误。问题似乎是阅读,但我不确定写作中的某些代码是否导致阅读失败
【问题讨论】:
-
您没有为您的字符串写出空字符终止符(strlen 不包括它)。实际上,你最好写
sizeof你的数组,写所有20个字节。这样一来,您的每条数据记录都将具有相同的大小,因此您可以直接访问它们,而不是按顺序访问它们(如果您愿意的话)。 -
我用这条线做了终结者。模型[计数] = 0;
-
-
错字。
fwrite(start->model, sizeof(char), strlen(start->make), ftp);-->fwrite(start->model, sizeof(char), strlen(start->model), ftp);,fwrite(&start->cost, sizeof(float), 1, ftp);fwrite(&start->mileage, sizeof(float),1,ftp);-->fwrite(&start->cost, sizeof(double), 1, ftp);fwrite(&start->mileage, sizeof(int),1,ftp); -
不用担心(不正确的)分隔符,只需将二进制字符串写为 strlen(s)+1