2016-06-15 20 views
0

Ich baue eine App zur Analyse wissenschaftlicher Daten mit . Ich bin nicht in der Lage, binäre Dateien zu laden und neue Binärdateien mit einem Teil des Inhalts aus der gelesenen Datei zu erstellen.Laden und Schreiben von Binärdateien mit gtk3 in c

Ich benutzte GFileoutputStream und aber sobald Null kommt, dauert es als Abschlusszeichen, die ich nicht will. Ich möchte gerade Nullen lesen und dann bitweise Daten extrahieren. Jede Hilfe würde sehr geschätzt werden.

Mein Code:

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


} 

Antwort

0

g_file_get_contents liest die gesamte Datei, wie Sie wollen. Wenn Sie jedoch die Länge wegwerfen und sie als Zeichenfolge in C behandeln, werden Sie offensichtlich Probleme haben, nach dem ersten Nullbyte zu lesen.

Das erste, was Sie tun sollten, ist die Länge zu speichern. Ändern Sie Ihren Anruf g_file_get_contents zu so etwas wie:

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

In der realen Welt Code sollten Sie auch den Rückgabewert überprüfen und/oder gError Argument ...

Jetzt haben Sie eine Reihe von Bytes in contents und die Anzahl der Bytes in length. Beachten Sie, dass length die Größe der gesamten Datei ist, nicht die Anzahl der Bytes bis zu den ersten Nullbytes. Sie können mit diesen Daten tun, was Sie wollen, denken Sie daran, dass in C Strings null-terminiert sind. Das bedeutet, wenn Sie den Puffer als Zeichenfolge behandeln, ist das erste Nullbyte das Ende dieser Zeichenfolge. Wenn Sie weiterlesen möchten, beginnen Sie einfach beim nächsten Byte erneut. Solange Sie nicht über das Ende der Datei hinausgehen, sollte es Ihnen gut gehen.