如何从文本文件填充组合框 - GTK - C.

时间:2016-11-19 19:32:19

标签: c combobox gtk glade

我无法从我拥有的文本文件中填充我的组合框。我们假设我有一个10行的文本文件(每行包含一个单词)。使用我的代码,组合框最终将包含最后一行的10个项目。

我的实际文本文件格式为:

2p1 23 blocA 
2p2 16 blocB 
2p3 19 blocB 

以下是我使用的初始代码:

    GtkWidget *create_class_combo ()
    {
       GList *glist = NULL;
       GtkWidget *combo;

       FILE *fp = NULL;
       Class c;

       combo = gtk_combo_new ();

       fp = fopen ("lists/class.txt","r");

       while (fscanf(fp, "%s %s %s \n", c.name, c.children, c.location) != EOF)
       {
           glist = g_list_append (glist, c.name);
       }

       fclose(fp);

       gtk_combo_set_popdown_strings (GTK_COMBO (combo), glist);

       return combo;
    }

这是类结构:

    typedef struct Class
    {
       char name[20];
       char children[10];
       char location[30];
    } Class;

经过一些测试,结果证明" g_list_append"如果你使用相同的变量作为第二个参数,它将覆盖它添加的最后一个项目。

所以,我使用了一个字符串数组。它没有用。它显示了一个空的组合框。

我使用的结构数组只包含一个字符串。它没有用。它显示了一个空的组合框。

我将g_list_concat与第二个GList变量一起使用,同时在每个"结束时初始化第一个"同时"周期。它也没有用。

我只是感到困惑。 你能帮我吗?

更新:我发现了组合框的不同功能,并在此代码中使用了它们。它现在有效。

GtkWidget *create_class_combo ()
{
GtkWidget *combo;

FILE *fp = NULL;
Class c;

combo = gtk_combo_box_text_new_with_entry ();

fp = fopen ("lists/class.txt","r");

while (fscanf(fp, "%s %s %s \n", c.name, c.children, c.location) == 3)
{
    gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), c.name);
}

fclose(fp);

return combo;
}

1 个答案:

答案 0 :(得分:0)

  1. 首先,您的fscanf()调用会返回匹配数,但您没有检查,它可能会返回0而不是EOF,因为没有匹配并且在上一次读取操作中也未到达文件末尾,因此您需要检查它是否返回3而不是EOF

    此外,您应该尝试防止缓冲区溢出。您可以为"%s"说明符使用长度修饰符,并使用目标数组的长度 - 1.

    最后,每一行的中间值似乎都是一个整数,因此您可以使用"%4s%d%6s"作为fscanf()的格式参数并记住,请检查3而不是{{1} }。

  2. 您应该阅读如何填充gtk+中的组合框。你可以使用EOFGtkTreeModel来轻松填充它,你也可以非常清楚地填写它。

    另一个好处是,您可以更好地控制组合框项目所包含的数据,您可以使用多个列,存储您可以从模型中轻松检索的额外数据。

  3. 这是一个如何做的例子,错误处理应该得到很多改进

    GtkTreeIter