使用c中的gtk3加载和写入二进制文件

时间:2016-06-15 08:49:32

标签: c gtk3 glib

我正在构建一个使用 分析科学数据的应用。我无法加载二进制文件并使用读取文件中的某些部分内容创建新的二进制文件。

我使用了GFileoutputStreamg_file_load_contents但是只要归零就会将其作为我不想要的终止字符。我想读甚至零,然后逐位提取数据。任何帮助都将受到高度赞赏。

我的代码:

 void file_selected(GtkWidget *filechooserbutton, gpointer data, GtkTextBuffer *buffer) {   
    filename=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooserbutton));
    g_file_get_contents(filename, &contents, NULL, NULL);

    text1 = g_substr(contents,0,value);     

    gint DataHeaderNum=96;
    gint value2=value+DataHeaderNum;
    text2 = g_substr(contents,value,value2);        

    gchar *filler;
    filler=g_strnfill (DataHeaderNum,'0');
    //g_print(filler);
    gint DataNum=2048-DataHeaderNum;
    gint value3=value2+DataNum;
    text3 = g_substr(contents,value,value3);
    g_strlcat(filler,text3,2048);
    text3=g_strdup(filler);
    //g_print(text3);


    gchar *full;
    gchar *name="SpaceCraftHeader";
    gchar *name2="DataHeader";
    gchar *name3="Data";

    full=g_strdup(filename);
    g_strlcat(full,name,50);

    GFile *file=g_file_new_for_path(full);
    GFileOutputStream *output=g_file_replace(
                file,NULL,FALSE,
                G_FILE_CREATE_NONE,
                NULL,NULL);

    g_output_stream_write(G_OUTPUT_STREAM(output),
                text1,strlen(text1),NULL,NULL);

    g_output_stream_close(G_OUTPUT_STREAM(output),NULL,NULL);


}

1 个答案:

答案 0 :(得分:0)

g_file_get_contents读取整个文件,就像您想要的那样。但是,如果你丢弃长度并将其视为C中的字符串,那么显然你会在读取第一个空字节后遇到问题。

你应该做的第一件事是保存长度。将您对g_file_get_contents的通话更改为:

gsize length;
g_file_get_contents(filename, &contents, &length, NULL);

在实际代码中,您还应该检查返回值和/或GError参数......

现在,contents中有一个字节数组,length中有一个字节数。请注意,length是整个文件的大小,不是直到第一个空字节的字节数。您可以使用该数据执行任何操作,请记住,在C中,字符串以空值终止。这意味着如果您选择将缓冲区视为字符串,则第一个空字节是该字符串的结尾。如果你想继续阅读,只需在下一个字节重新开始;只要你没有超过文件的末尾,你应该没事。