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

时间:2010-05-07 07:06:05

标签: c++ istream arrays 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)

2 个答案:

答案 0 :(得分:8)

字符串

中的空字符没有什么特别之处
std::istringstream iss(std::string(data, N));
setBlob(&iss);

当然,如果你这样做

std::istringstream iss("haha a null: \0");

它会将其解释为转换为std::string的C风格字符串,因此将停在\0,而不是将其作为实际内容字节。明确地说明std::string大小允许它将任何空字节作为真实内容数据使用。

如果要直接从char数组中读取,可以使用strstream

std::istrstream iss(data, N);

这将直接读取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)
  { }
};

答案 1 :(得分:0)

  

//这里只有部分数据存储在数据库blob字段中(直到第一个空字符)

你是如何检查的?如果你只是把它倾倒到cout,它可能会在第一个时间停止。您需要逐个字符地打印。