2010-05-07 4 views
4

У меня есть массив символов, который содержит нулевые символы в случайных местах. Я попытался создать iStringStream с помощью этого массива (encodedData_arr), как показано ниже:Как создать C++ istringstream из массива char с нулевыми (0) символами?

Я использую этот iStringStream для вставки двоичных данных (imagedata Iplimage) в поле BLOB базы данных MySQL (с помощью setBlob (istream *) 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) 

ответ

9

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

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

Конечно, если вы

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

Он будет интерпретировать это как строка C-стиля преобразуются в std::string, и таким образом, остановится на \0, не принимая его в качестве реального байта содержимого. Говоря std::string, размер явно позволяет ему использовать любой нулевой байт в качестве реальных данных контента.

Если вы хотите прочитать непосредственно из массива символов, вы можете использовать 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

Почему вы используете 'static_cast' в конструкторе' istream'? Он работает так же хорошо, как это: 'std :: istream (& m)' – mavam

+0

В моем опыте проблемы появляются даже с 'std :: string (data, N)' ... – Yoric

0

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

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

Смежные вопросы