gtk+ および gtksourceview-2.0 で C 言語を使用してプログラムを作成しています。
ユーザーがファイルを選択するために GtkFileChooser を使用しています。ユーザーがファイルをクリックすると、コンテンツが GtkSourceView の TextBuffer に読み込まれます。
これは、ユーザーが GtkFileChooser でファイルをダブルクリックしたときに実行される関数です。
void on_file_activated(GtkWidget *widget, gpointer data) {
GFile *file;
FILE *fp;
gchar *path_name;
long file_size;
gchararray file_buffer;
file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(widget));
path_name=g_file_get_path(file);
g_debug("%s is chosen\n", path_name);
fp=fopen(path_name, "r");
g_assert( fp != NULL);
fseek(fp, 0L, SEEK_END);
file_size = ftell(fp);
rewind(fp);
g_debug("file size: %ld\n",file_size*sizeof(gchar));
file_buffer=calloc(file_size, sizeof(gchar));
g_assert(file_buffer != NULL);
fread(&file_buffer,file_size,1,fp);
g_debug("after fread");
//file_buffer[file_size*sizeof(gchar)]=0;
//g_debug("after adding zero: %s",file_buffer);
gtk_text_buffer_set_text (textbuffer, file_buffer,2);
g_debug("after set text");
g_object_unref(file);
}
これは私のアプリケーションの出力です:
** (tour_de_gtk:18107): DEBUG: /home/ufk/Projects/gtk-projects/tour-de-gtk/Debug/src/examples/example_gtk_label/main.c is chosen
** (tour_de_gtk:18107): DEBUG: file size: 16
** (tour_de_gtk:18107): DEBUG: after fread
その後、コマンド gtk_text_buffer_set_text でセグメンテーション違反が発生します
ご覧のとおり、コメント アウトされた 2 つのコマンドがあります。文字列の末尾にゼロを追加しなかったため、明らかにセグメンテーション違反を引き起こすバッファを g_debug しようとしました。文字列の末尾にゼロを追加しようとしても、セグメンテーション違反が発生します。私はおそらく何か間違ったことをしました。
ここでは、バッファの最初の 2 文字だけを書き込もうとしていますが、うまくいきません。
何か案は?
アップデート
完成した関数:
void on_file_activated(GtkWidget *widget, gpointer data) {
GFile *file;
gchar *path_name;
long file_size;
gchar *file_buffer;
GError *error;
gboolean read_file_status;
file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(widget));
path_name=g_file_get_path(file);
g_debug("%s is chosen\n", path_name);
read_file_status=g_file_get_contents (path_name,&file_buffer,NULL, &error);
if (read_file_status == FALSE) {
g_error("error opening file: %s\n",error && error->message ? error->message : "No Detail");
return;
}
gtk_text_buffer_set_text (textbuffer, file_buffer,-1);
g_debug("after set text");
g_object_unref(file);
}