2017-09-20 4 views
-1

バイナリデータをファイルに書き込もうとしていますが、セグメンテーションフォルトが発生します。私はsqliteブロブからバイナリデータを取得します。 私はこのコードで助けが必要です。 書き込みコマンドでエラーが発生します。 sqliteのコールバック:C++ fstream.writeセグメンテーションフォールト

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

書き込み機能:

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

あなたは多くのポインタを持っています - 彼らは何を指していますか?セグメンテーションフォルトの一般的な理由は、どこにも指していないということです(初期化されていません) –

+0

コールバック関数の入力を理解しようとしていましたが、何も理解できませんでした。 – ssovukluk

+0

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

答えて

1

sqlite3_exec()はpreapre /ステップ/確定ループの周りだけのラッパーです。

sqlite3_exec() documentation

は言う:

sqlite3_exec()コールバックに第3引数は、sqlite3_column_text()からかのようにして得られた文字列へのポインタのアレイ、各列に対して1つです。

sqlite3_step()への最新の呼び出しがSQLITE_ROWを返したし、どちらもsqlite3_reset()sqlite3_finalize()がその後呼び出されたとき、これらのルーチンにのみ呼び出すことがあります。ドキュメントが言うこと

これらのルーチンのいずれかがsqlite3_reset()またはsqlite3_finalize()の後に呼び出された場合、またはsqlite3_step()SQLITE_ROW以外の何かを返した後に結果が未定義です。

つまり、コールバックが戻った後に文字列が消えます。文字列の内容をコピーする必要があります。

関連する問題