Mor*_*eus 4 c++ arrays istream null-character
我有一个char数组,在随机位置包含空字符.我尝试使用此数组(encodedData_arr)创建一个iStringStream,如下所示,
我使用这个iStringStream将二进制数据(Iplimage的imagedata)插入MySQL数据库blob字段(使用MySQL Connector/C++的setBlob(istream*is)),它只存储第一个空字符的字符.
有没有办法使用带有空字符的char数组创建iStringStream?
unsigned char *encodedData_arr = new unsigned char[data_vector_uchar->size()];
// Assign the data of vector<unsigned char> to the encodedData_arr
for (int i = 0; i < vec_size; ++i)
{
cout<< data_vector_uchar->at(i)<< " : "<< encodedData_arr[i]<<endl;
}
// Here the content of the encodedData_arr is same as the data_vector_uchar
// So char array is initializing fine.
istream *is = new istringstream((char*)encodedData_arr, istringstream::in || istringstream::binary);
prepStmt_insertImage->setBlob(1, is);
// Here only part of the data is stored in the database blob field (Upto the first null character)
Run Code Online (Sandbox Code Playgroud)
字符串中的空字符没有什么特别之处
std::istringstream iss(std::string(data, N));
setBlob(&iss);
Run Code Online (Sandbox Code Playgroud)
当然,如果你这样做
std::istringstream iss("haha a null: \0");
Run Code Online (Sandbox Code Playgroud)
它会将其解释为转换为C风格的字符串std::string,因此将停止,而\0不是将其作为实际内容字节.std::string明确地告诉大小允许它使用任何空字节作为真实内容数据.
如果要直接从char数组中读取,可以使用 strstream
std::istrstream iss(data, N);
Run Code Online (Sandbox Code Playgroud)
这将直接从提供的数据中读取data,最多为N字节.strstream正式声明为"已弃用",但它仍将在C++ 0x中,因此您可以使用它.或者你创建自己的streambuf,如果你真的需要从这样的原始读取char*.
struct myrawr : std::streambuf {
myrawr(char const *s, size_t n) {
setg(const_cast<char*>(s),
const_cast<char*>(s),
const_cast<char*>(s + n));
}
};
struct hasb {
hasb(char const *s, size_t n)
:m(s, n)
{ }
myrawr m;
};
// using base-from-member idiom
struct myrawrs : private hasb, std::istream {
myrawrs(char const *s, size_t n)
:hasb(s, n),
std::istream(&static_cast<hasb*>(this)->m)
{ }
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7892 次 |
| 最近记录: |