【问题标题】:initialize values of a nested struct from a file从文件初始化嵌套结构的值
【发布时间】:2015-02-06 09:12:09
【问题描述】:

我在使用 C 中的 struct 时遇到问题,有人可以帮忙吗?我是 C 和结构的新手,所以请善待我。我在下面声明了两个结构,其中一个嵌套在另一个内部。

struct orders_tag {
    int number_of_orders;
    char item_name[20];
    int price;
};

typedef struct orders_tag order;

struct customer_tag {
    char name[30];
    order total_order[10];
};

typedef struct customer_tag customer;

我也在 main 中初始化了这些值。

customer cus_array[20];
customer c;

我正在尝试从文件中读取信息并将这些值放入我的嵌套结构中,但我真的不明白这里发生了什么。任何解释将不胜感激。

infile = fopen("input.txt", "r");

if (infile == NULL) {
    printf("Couldn't open the fire.");
    return 1;
}

while (fscanf(infile, "%s %d %s %2f", c.name, c.total_order.number_of_orders
        , c.total_order.item_name, c.total_order.price) != EOF) {

}

我相信我得到的唯一错误来自 while 循环条件。

【问题讨论】:

  • total_order 是一个数组。所以这个c.total_order.item_name 和这个c.total_order.price 不会编译。
  • 谢谢,我想我会制作一些本地临时变量并将文件中的值放入这些临时变量中,然后从那里手动初始化结构。

标签: c arrays file-io struct format-specifiers


【解决方案1】:

在您的代码中,price 被定义为int,您使用%2f 来读取值。不正确。

仅供参考,第 7.19.6.2 章第 10 段,C99 标准,

除非用 * 表示赋值抑制,否则转换的结果将放在后面的第一个参数所指向的对象中 尚未收到转换结果的格式参数。如果此对象没有适当的类型,或者转换结果无法在对象中表示,则行为未定义。

接下来,使用fscanf(),您应该提供必须存储值的内存位置的指针。您需要根据需要使用&

另外,在c.total_order.number_of_orders 的情况下,total_order 是一个数组,因此您必须使用数组下标来表示数组中的特定变量。像

c.total_order[i].number_of_orders

其中i 用作索引。

【讨论】:

  • 看看totalorder是个数组。也有问题
  • @gopi 谢谢。只是更新那个。 :-)
  • @Gopi 谢谢先生。还在fscanf() 中解决了这个问题:-)
  • 在这里感谢很多好的答案,但既然你先回答了,我会选择你的答案。
  • @ln206 很高兴它有帮助。对于所有好的答案,您始终可以选择投票以向该问题的未来访问者展示这些答案是好的和有用的。干杯!! :-)
【解决方案2】:

在您将 total_order 声明为数组的 customer_tag 结构中,您应该在扫描值时引用每个元素。此外,在 fscanf 中的 int 值之前需要一个 &

while (fscanf(infile, "%s %d %s %2f", c.name, &(c.total_order[0].number_of_orders)
        , c.total_order[0].item_name, &(c.total_order[0].price)) != EOF) {}

只是可能有某种增量器来更改您正在访问的 total_order 数组的哪个元素

【讨论】:

    【解决方案3】:
    int i=0;
    while (fscanf(infile, "%s %d %s %d", &c.name,&c.total_order[i].number_of_orders
            , &c.total_order[i].item_name, &c.total_order[i].price) == 4) {
    i++;
    }
    

    只需添加有关如何将值读取到结构中的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多