gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:53:57 25 4
gpt4 key购买 nike

我在从已有的文本文件中填充组合框时遇到问题。假设我有一个 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 变量一起使用,同时还在每个“while”循环结束时初始化第一个变量。但效果并不好。

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

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

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. 首先,您的 fscanf() 调用返回匹配数,而您没有检查这一点,它可能返回 0 而不是 EOF 因为没有匹配,并且在之前的读取操作中也没有到达文件末尾,所以您需要检查它是否返回 3 而不是 EOF.

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

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

  2. 您应该阅读 gtk+ 中有关如何填写组合框的信息。 。您可以使用 GtkTreeModelGtkTreeIter 来非常轻松地填充它,并且您的操作方式也会非常清晰。

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

这是一个如何做到这一点的示例,错误处理应该得到很大的改进

#include <gtk/gtk.h>

typedef enum Columns {
Name, Children, Location, ColumnsCount
} Columns;

static GtkWidget *
create_and_populate_combo_box()
{
GtkListStore *model;
GtkWidget *combo;
GtkTreeIter iter;
GtkCellRenderer *column;
char name[4];
int children;
char location[6];
FILE *file;
// Create a new list store
model = gtk_list_store_new(ColumnsCount,
G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING);
if (model == NULL)
return NULL;
// Create the combo box
combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(model));
if (combo == NULL)
return NULL;
// Create a cell renderer to render text only (this is a basic one)
column = gtk_cell_renderer_text_new();
if (column == NULL)
return NULL;
// Install the cell renderer and set the text column
gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), column, TRUE);
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo),
column, "text", Name, NULL);
// Read data from the file
file = fopen("data.dat", "r");
if (file == NULL)
return NULL;
while (fscanf(file, "%4s%d%6s", name, &children, location) == 3) {
gtk_list_store_append(GTK_LIST_STORE(model), &iter);
gtk_list_store_set(GTK_LIST_STORE(model), &iter,
Name, name, Children, children, Location, location, -1);
}
fclose(file);
// Set the first value as active
gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
return combo;
}

int
main(int argc, char **argv)
{
GtkWidget *window;
GtkWidget *combo;
gtk_init(&argc, &argv);

window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
if (window == NULL)
return -1;
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
combo = create_and_populate_combo_box();
if (combo == NULL)
return -1;
gtk_widget_set_size_request(window, 100, -1);
gtk_container_add(GTK_CONTAINER(window), combo);
gtk_widget_show_all(window);
gtk_main();
return 0;
}

关于c - 如何从文本文件填充组合框 - GTK - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40697063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com