Hi.
For files that are less than 1MB in size, I usually use
g_file_get_contents, which slurps the whole file into a single string, which can be later manipulated.
To display file contents of the file, you'll also need some kind of display widget. For small amounts of text, GtkEntry may do, but in your situation, GtkTreeView is probably what you're looking for.
Below you'll find a minimalistic sample application that loads file into text view and is capable of saving it back to file.
Code:
/*
Compile me with:
gcc -Wall -o text text.c $(pkg-config --cflags --libs gtk+-2.0)
*/
#include <gtk/gtk.h>
typedef struct _Data Data;
struct _Data
{
GtkTextBuffer *buffer;
GtkWindow *parent;
};
static void
cb_load_file( GtkButton *button,
Data *data )
{
static GtkWidget *dialog = NULL;
if( ! dialog )
{
dialog = gtk_file_chooser_dialog_new( "Open file", data->parent,
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_STOCK_OPEN,
GTK_RESPONSE_ACCEPT,
GTK_STOCK_CANCEL,
GTK_RESPONSE_REJECT,
NULL );
}
if( gtk_dialog_run( GTK_DIALOG( dialog ) ) == GTK_RESPONSE_ACCEPT )
{
gchar *filename;
gchar *text;
filename = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER( dialog ) );
g_file_get_contents( filename, &text, NULL, NULL );
gtk_text_buffer_set_text( data->buffer, text, -1 );
g_free( filename );
g_free( text );
}
gtk_widget_hide( dialog );
}
static void
cb_save_file( GtkButton *button,
Data *data )
{
static GtkWidget *dialog = NULL;
if( ! dialog )
{
dialog = gtk_file_chooser_dialog_new( "Save file", data->parent,
GTK_FILE_CHOOSER_ACTION_SAVE,
GTK_STOCK_SAVE,
GTK_RESPONSE_ACCEPT,
GTK_STOCK_CANCEL,
GTK_RESPONSE_REJECT,
NULL );
}
if( gtk_dialog_run( GTK_DIALOG( dialog ) ) == GTK_RESPONSE_ACCEPT )
{
gchar *filename;
gchar *text;
g_object_get( G_OBJECT( data->buffer ), "text", &text, NULL );
filename = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER( dialog ) );
g_file_set_contents( filename, text, -1, NULL );
g_free( filename );
g_free( text );
}
gtk_widget_hide( dialog );
}
int
main( int argc,
char **argv )
{
GtkWidget *window,
*vbox,
*swindow,
*text,
*save,
*load;
GtkTextBuffer *buffer;
Data *data;
gtk_init( &argc, &argv );
data = g_slice_new( Data );
window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
g_signal_connect( G_OBJECT( window ), "destroy",
G_CALLBACK( gtk_main_quit ), NULL );
vbox = gtk_vbox_new( FALSE, 6 );
gtk_container_add( GTK_CONTAINER( window ), vbox );
swindow = gtk_scrolled_window_new( NULL, NULL );
gtk_box_pack_start( GTK_BOX( vbox ), swindow, TRUE, TRUE, 0 );
text = gtk_text_view_new();
buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW( text ) );
gtk_container_add( GTK_CONTAINER( swindow ), text );
save = gtk_button_new_from_stock( GTK_STOCK_SAVE );
g_signal_connect( G_OBJECT( save ), "clicked",
G_CALLBACK( cb_save_file ), data );
gtk_box_pack_start( GTK_BOX( vbox ), save, FALSE, FALSE, 0 );
load = gtk_button_new_from_stock( GTK_STOCK_OPEN );
g_signal_connect( G_OBJECT( load ), "clicked",
G_CALLBACK( cb_load_file ), data );
gtk_box_pack_start( GTK_BOX( vbox ), load, FALSE, FALSE, 0 );
data->buffer = buffer;
data->parent = GTK_WINDOW( window );
gtk_widget_show_all( window );
gtk_main();
g_slice_free( Data, data );
return( 0 );
}