2017-09-20 3 views
-1

Ich versuche, Binärdaten in Datei zu schreiben, und ich bekomme Segmentierung Fehler. Ich bekomme Binärdaten von SQLite Blob. Ich brauche Hilfe mit diesem Code. Fehler beim Schreiben des Befehls. sqlite Rückruf:C++ fstream.write Segmentierung Fehler

static int callback(void* object, int, char** data, char**) 
{ 
    if (fromdb* const art= static_cast<fromdb*>(object)) 
    { 
     art->title = *data[1]; 
     art->creator = *data[2]; 
     art->bin = data[3]; 
     art->year = *data[4]; 
    } 
    return 0; 
} 

Schreibfunktion:

void write() { 
    // << bin; 
    ofstream towrite; 
    string name; 
    cout << "Podaj nazwe pliku do zapisu"; 
    cin >> name; 
    towrite.open(name, ios::out | ios::binary); 
    towrite.write(bin, sizeof(bin)); 
    towrite.close(); 
} 
+0

Sie haben viele Zeiger - worauf zeigen sie? Ein häufiger Grund für einen Segmentierungsfehler ist, dass sie nirgendwohin zeigen (nicht initialisiert). –

+0

Ich habe versucht, die Eingabe Ihrer Callback-Funktion zu verstehen, ich konnte nichts verstehen, was es war. – ssovukluk

+0

versuche art-> bin = * data [3]; ? – ssovukluk

Antwort

1

sqlite3_exec() ist nur ein Wrapper um einen Preapre/step/finalisieren Schleife.

The sqlite3_exec() documentation sagt:

Das 3. Argument des sqlite3_exec() Rückruf ein Array von Zeigern auf Strings erhalten wird, als ob von sqlite3_column_text(), ein für jede Spalte.

Diese Dokumentation sagt:

Diese Routinen nur aufgerufen werden, wenn der letzte Aufruf von sqlite3_step() hat SQLITE_ROW zurückgekehrt und weder sqlite3_reset() noch sqlite3_finalize() werden später genannt. Wenn eine dieser Routinen nach sqlite3_reset() oder sqlite3_finalize() aufgerufen wird oder nachdem sqlite3_step() etwas anderes als SQLITE_ROW zurückgegeben hat, sind die Ergebnisse undefiniert.

Mit anderen Worten: die Strings verschwinden, nachdem der Callback zurückkehrt; Sie müssen den Inhalt der Zeichenfolgen kopieren.