我无法从我拥有的文本文件中填充组合框。假设我有一个10行的文本文件(每行包含一个单词)。使用我的代码,组合框将最终有10行的最后一行。如何从文本文件填写组合框 - C
我的实际文本文件的格式如下:
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;
}
你'的fscanf()'是错误的。你应该检查'3'而不是'EOF'。它现在的方式可能导致未定义的行为。您还应该检查值是否正在读取,而不是仅附加到列表中。 –
@iharob“fscanf()”工作正常。我测试了它,这就是我总是使用它的方式。我继续扫描,直到我打开EOF,确保我遍历了我的所有文件。这些值也被读取并正确存储到变量中。 您可以尝试制作“名称”字符串。给它一个价值。将它附加到glist上。然后给它另一个价值。将它再次附加到同一个列表中。该列表将显示为与您最后添加的值相同的两个项目。 – Elyes
你总是使用它错误。阅读文档。您的代码容易出现未定义的行为。 –