如何从带有null(0)字符的字符数组创建C++的istringstream?

4

我有一个字符数组,其中包含随机位置的空字符。我尝试使用以下方式创建iStringStream,使用该数组(encodedData_arr):

我使用这个iStringStream将二进制数据(Iplimage的图像数据)插入到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)
2个回答

8

字符串中的空字符没有什么特别之处。

std::istringstream iss(std::string(data, N));
setBlob(&iss);

当然,如果您这样做
std::istringstream iss("haha a null: \0");

这段内容涉及到it技术,它解释了一些关于C-style字符串转换为std::string时的注意事项。如果不显式地告诉std::string字符串的长度,它会将字符串视为一个C-style字符串并在\0处停止,而不将其作为真正的内容字节。如果你想让std::string将任何空字节都作为真正的内容数据消耗掉,就需要显式地告诉它字符串的长度。

如果你想直接从一个char数组中读取数据,可以使用strstream

std::istrstream iss(data, N);

这将直接从data提供的数据中读取,最多N个字节。虽然strstream已被官方宣布为“弃用”,但它仍将出现在C++0x中,所以您可以使用它。或者,如果您确实需要像那样从原始的char*读取,可以创建自己的streambuf

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

为什么在istream构造函数中使用static_cast?像这样使用也可以正常工作:std::istream(&m) - mavam

0
// 这里只有部分数据存储在数据库的 blob 字段中(直到第一个空字符) 你是如何检查这个的?如果你只是将它倒出来到 cout,它可能会停在第一个 nul。你需要逐个字符打印。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接