2016-06-15 8 views
0

を使用して科学的データを分析するアプリケーションを構築しています。バイナリファイルを読み込むことができず、読み込みファイルからコンテンツの一部を使って新しいバイナリを作成することができません。cでgtk3を使用してバイナリファイルを読み書きする

私は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); 


} 

答えて

0

g_file_get_contentsは、あなたがしたいだけのよう、ファイル全体を読み込みます。しかし、長さを捨ててCで文字列として扱うと、明らかに最初のヌルバイトを越えて読むことに問題があります。

最初にすべきことは、長さを保存することです。今、あなたはcontentsにバイトの配列を持っている

...あなたはまた、戻り値および/またはGErrorを格納引数をチェックする必要があり、現実世界のコードでは

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

、および:ようなものにg_file_get_contentsにお電話を変更lengthのバイト数lengthは、ファイル全体のサイズで、ではなく、の最初のヌルバイトまでのバイト数です。そのデータで何でもできますが、Cでは文字列がNULLで終了することに注意してください。つまり、バッファをストリングとして扱うことを選択した場合、最初のヌルバイトはそのストリングの終わりです。読み続けるには、次のバイトから始めてください。あなたがファイルの最後を過ぎていない限り、あなたはうまくいくはずです。

関連する問題