这是我的代码。我正在做一些处理文件的C练习
我不认为结构定义是问题,但我也发布它以给出一些上下文。
typedef struct carType Car;
struct carType {
int vehicleID;
char make[20];
char model[20];
int year;
int mileage;
double cost;
Car *next;
};
我认为这个功能会导致分段失败。
void TextLoad(Car *headPointer)
{
char fileName[20];
//prompt user for name of textfile to print to
scanf("%s", fileName);
FILE *fpt;
//estabish an IO connection
fpt = fopen(fileName, "r");
//current car to be printed
Car *current;
current = headPointer->next;
while(fscanf(fpt,"%d %s %s cost:$%f mileage:%d, vehicleID:%d",¤t->year,
current->make, current->model,¤t->cost,¤t->mileage, ¤t->vehicleID) != EOF)
{
current = current->next;
}
fclose(fpt);
}
我测试此功能的文件有此内容
2014 Toyota Celica cost:$90000 mileage:5000, vehicleID:1
2014 Toyota Rav4 cost:$4500 mileage:4000, vehicleID:2
我所拥有的基本上是一个struct car,我想使用文件中的信息来初始化struct car的字段。有谁知道这个细分失败的来源?我检查了其他线程fclose() causing segmentation fault和Code fails with segmentation fault,但我确保调用fclose来关闭IO连接,并且我没有初始化另一个文件指针但是工作正常。 我认为问题是fscanf,但我的格式不正确吗?
答案 0 :(得分:3)
您似乎已经调整了写入结构的循环,并将其用于读取结构。
问题是您正在阅读的区域可能未被分配。所以你的数据被读入了黑色和段错误。
要按原样工作,您的函数应该会收到有效的headPointer
。你可以通过向headPointer
本身接收指针来做得更好,headPointer
的值可能为NULL(即如果你刚刚开始)。如果是这种情况,则更新headPointer值,使其成为有效的结构。
在循环过程中重复相同的操作。
为了实用,与创建新结构相关的操作应该外包给一个单独的功能。
然后应该循环:
*curPointerPtr = headPointerPointer;
while (!feof(fpt)) {
// We need to allocate a new Car.
*curPointer = newCar(); // Check it is not NULL (unless newCar throws an error)
fscanf(into *curPointer)
// prepare curPointer to accept next
*curPointer = (*curPointer)->next;
}
分配新车的功能也可以最小化它(至少null所有指针和零终止所有字符串):
Car *newCar(void) {
Car *car;
car = malloc(sizeof Car);
if (NULL == car) {
// Throw an error
} else {
// ALSO initialize the structure - good practice
car->make[0] = 0x0;
car->model[0] = 0x0;
car->next = NULL;
}
return car;
}
答案 1 :(得分:2)
在我看来,你并没有为汽车结构分配空间。您创建一个指针,但是您必须使用malloc为它创建内存。我认为您可以使用sizeof(carType)作为malloc的参数来获取结构的大小。已经有一段时间了,因为我使用直接c这样,在C ++和C#中你可以使用new来调用构造函数,编译器会进行内存管理。
所以它看起来像这样:
Car *current = malloc(sizeof(carType));//you might want to try sizeof(car) if that doesn't work