1

因此,任务是读取文件并将数据推送到结构中。数据文件是:

babe 12 red 12
deas 12 blue 12
dsa 12 red 512
bxvx 15 blue 52
reed 18 black 15

虽然代码是这样的

struct shoes {
    char name[8];
    int size;
    char color[8];
    int price;       
};
//open file
shoes *item=(struct shoes*)malloc(sizeof(struct shoes));
for (i=0; !feof(file); i++) {
    item=(struct shoes*)realloc(item,sizeof(struct shoes)+i*sizeof(struct shoes));
    fscanf(file,"%s %i %s %i\n",(item+i)->name,(item+i)->size,(item+i)->color,(item+i)->price);
}

但程序每次都会崩溃。dbg 说:在当前上下文中没有符号“项目”。错误在哪里?

4

4 回答 4

3

问题是您没有传递指向要使用读取的整数的指针fscanf,而是传递整数本身。

fscanf将它们视为指针。他们指向哪里?谁知道-整数未初始化,因此它们可以指向ANYWHERE。因此,崩溃

因此修复:

fscanf(file,"%s %i %s %i\n",
    (item+i)->name,
    &((item+i)->size),
    (item+i)->color,
    &((item+i)->price));

请注意,您不需要相同的namecolor因为数组退化为指针,所以您已经传递了正确的东西。

请考虑放弃item+i符号;item[i]随便看代码就更清晰更容易理解了

fscanf("%s %i %s %i\n", 
    item[i].name, 
    &item[i].size, 
    item[i].color,
    &item[i].price);
于 2013-04-03T17:14:12.040 回答
3

您的代码有一些错误:1)除非您使用 C++ 编译器进行编译,否则您需要鞋的 typedef ...但是您应该标记此 C++。2) feof 直到实际尝试读取文件末尾之后才返回 false,因此您的代码使鞋子 1 的数组太大。3)您将整数传递给 fscanf 而不是它们的地址。

如果编译为 C 代码而不是 C++ 代码,则不需要对 malloc 和 realloc 进行强制转换,建议不要这样做。还有其他文体问题让你的代码更难理解。试试这个:

typedef struct {
    char name[8];
    int size;
    char color[8];
    int price;       
} Shoe;

// [open file]

Shoe* shoes = NULL; // list of Shoes
Shoe shoe; // temp for reading

for (i = 0; fscanf(file,"%s %i %s %i\n", shoe.name, &shoe.size, shoe.color, &shoe.price) == 4; i++)
{
    shoes = realloc(shoes, (i+1) * sizeof *shoes);
    if (!shoes) ReportOutOfMemoryAndDie();
    shoes[i] = shoe;
}
于 2013-04-03T17:29:46.077 回答
2

你确定调试器这么说吗?我很惊讶它甚至编译...

你自找的:

struct shoes *item

如果您没有证明您的结构的 typedef,则每次引用它时都必须明确地说“struct”。

第二个注意事项:

item=(struct shoes*)realloc(item...

不要分配与realloc()传递给它的指针相同的指针。如果重新分配失败,它将返回 NULL,这可能会杀死你。你应该确保你正在检查初始malloc()realloc()

第三点:

您需要将int 的地址传递给 fscanf()。

fscanf(file,"%s %i %s %i\n",(item+i)->name,&((item+i)->size),(item+i)->color,&((item+i)->price));
于 2013-04-03T17:04:05.320 回答
1

您的代码有两个问题:

第一个。结构:

你可以用两种方式定义你的结构,就像你做的那样:

struct shoe{    
 char name[8];
 int size;
 char color[8];
 int price;  
};

在这种情况下,您应该将指向它的指针称为:

struct shoe *item;

另一种(可能更方便?)使用 typedef 和 defenition 的方式:

typedef struct {    
 char name[8];
 int size;
 char color[8];
 int price;  
} shoe;

在这种情况下,您应该将指向它的指针称为:

shoe *item;

因此,您发布的代码不应该编译。

第二个:

在您展示的情况下,应该为 fscanf 提供指向整数/字符的指针。你已经正确地传递了 char 指针(因为你传递了一个 char 数组的名称,它实际上是一个指向第一个元素的 char 指针),但是你已经传递了一些整数并且 fscanf 需要指向它应该填充的整数的指针,所以你的代码应该是:

fscanf(file,"%s %i %s %i\n",(item+i)->name,&((item+i)->size),(item+i)->color,&((item+i)->price));
于 2013-04-03T17:26:35.260 回答