我无法从我拥有的文本文件中填充我的组合框。我们假设我有一个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;
}
答案 0 :(得分:0)
首先,您的fscanf()
调用会返回匹配数,但您没有检查,它可能会返回0
而不是EOF
,因为没有匹配并且在上一次读取操作中也未到达文件末尾,因此您需要检查它是否返回3
而不是EOF
。
此外,您应该尝试防止缓冲区溢出。您可以为"%s"
说明符使用长度修饰符,并使用目标数组的长度 - 1.
最后,每一行的中间值似乎都是一个整数,因此您可以使用"%4s%d%6s"
作为fscanf()
的格式参数并记住,请检查3
而不是{{1} }。
您应该阅读如何填充gtk+中的组合框。你可以使用EOF
和GtkTreeModel
来轻松填充它,你也可以非常清楚地填写它。
另一个好处是,您可以更好地控制组合框项目所包含的数据,您可以使用多个列,存储您可以从模型中轻松检索的额外数据。
这是一个如何做的例子,错误处理应该得到很多改进
GtkTreeIter