Как создать istringstream в C ++ из массива char с нулевыми (0) символами? - PullRequest
4 голосов
/ 07 мая 2010

У меня есть массив символов, который содержит нулевые символы в случайных местах. Я попытался создать iStringStream, используя этот массив (encodedData_arr), как показано ниже,

Я использую этот iStringStream для вставки двоичных данных (imagedata Iplimage) в поле BLOB-объекта базы данных MySQL (используя setBlob (istream * is) MySQL Connector / C ++), в нем хранятся только символы до первого нулевого символа.

Есть ли способ создать iStringStream, используя массив char с нулевыми символами?

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 голосов
/ 07 мая 2010

В строковых символах нет ничего особенного

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

Конечно, если вы делаете

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

Он будет интерпретировать это как строку в стиле C, преобразованную в std::string, и, таким образом, остановится на \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)
  { }
};
0 голосов
/ 07 мая 2010

// Здесь только часть данных хранится в поле BLOB-объекта базы данных (до первого нулевого символа)

Как ты это проверяешь? Если вы просто бросаете его в cout, он, вероятно, останавливается на первом нуле. Вам нужно будет печатать символ за символом.

...