0

我终于想出了如何将二进制文件读入ram,然后将其写入某个地方

ifstream::pos_type size;
char * memblock;

/* ...bunch of stuff... */

ifstream infile(filename1.c_str(), ios::in|ios::binary|ios::ate);
ofstream outfile(filename2.c_str(), ios::out|ios::binary);

if (infile.is_open())
{
    size = infile.tellg();
    memblock = new char [size]; //request mem allocation of that size

    infile.seekg(0, ios::beg);  //move to begining
    infile.read(memblock, size);//read file
    infile.close();             //close file

    outfile.write(memblock,size);
    outfile.close();
}

我还测试过它outfile.write(memblock,sizeof(memblock));工作得很好所以我将它与 sqlite 一起应用,并通过将它存储在数据库中sqlite3_bind_blob(stmt,2,memblock,size,SQLITE_TRANSIENT);以及与它一起使用的所有其他东西(如 htestep等)逐步完成它。我能够从表与

sqlite3_prepare_v2(db,"SELECT Data, Size FROM table1",-1,&stmt,0);
sqlite3_step(stmt);

char * result = (char * )sqlite3_column_blob(stmt,0);
outfile.write(result,size);

这也很好用。但是,当我改用它时outfile.write(result,sizeof(result));,它不起作用size - sizeof(result)让我得到很大的数字(我只是在寻找一个 0 或不是大部分)所以我真的不知道它哪里出错了。是否将数据输入数据库错误?我检索数据是否错误?

我什至尝试添加另一列,然后插入size并使用它,但由于某种原因似乎不起作用

4

1 回答 1

1

我也测试过它outfile.write(memblock,sizeof(memblock));工作得很好

这是极不可能的。sizeof(memblock) == sizeof(char*) == 4(或者可能是 8 个)。它不报告指向的数据块的大小memblocksizeof(result)出于同样的原因不起作用。

请注意,您不需要将 blob 的大小作为单独的列存储在数据库中。SQLite 跟踪大小;您可以使用sqlite3_column_bytes.

于 2013-09-14T12:38:35.647 回答