stringstream sgetn возвращает NULL на iOS 5.1 - PullRequest
3 голосов
/ 26 марта 2012

У меня есть код, который копирует содержимое std::stringstream в char * dest

    static size_t copyStreamData(std::stringstream & ss, char * const & source, char * dest)
    {
        ss.str("");
        ss.clear();
        ss << source;
        size_t ret = ss.rdbuf()->sgetn( dest, (std::numeric_limits<size_t>::max)() ) ;
        dest[ret] = 0;
        return ret;
    }

на iOS 5.0 и ниже работает нормально, как и ожидалось ... Но в iOS 5.1 возвращается NULL.

Что я делаю не так? также Как я могу исправить мой код?

Ответы [ 2 ]

2 голосов
/ 26 марта 2012

То, что вы пытаетесь сделать, в основном аналогично тому, как вы делаете:

std::size_t length = std::strlen(source) + 1; // + 1 for '\0'
std::copy(source, source + length, dest);
// Assuming dest has length + 1 bytes allocated for it

Я сомневаюсь, что sgetn возвращает NULL, так как sgetn возвращает std::streamsize, а не тип указателя.Это возвращает 0, или другая функция возвращает NULL?Вы пытались очистить поток перед вызовом rdbuf()?

1 голос
/ 26 марта 2012

Вы должны выбрать свое строковое представление.

Если по каким-то причинам вам приходится использовать C-строки, то ваша функция называется strncpy.

std::strncpy(dest, source, max_size_of_dest);

Читайте о предостережениях в ссылке.

Однако, если вы можете использовать лучшую абстракцию, тогда вам предлагается перейти на std::string.

void copy(std::string const& source, std::string& dest) { dest = source; }

Не очень важно иметь дело с длиной буфера (и, следовательно, не портить чаще, чем нет).

Обратите внимание, что ничто не мешает вам манипулировать std::string в вашем приложении и при этом поддерживать связь с методами C: .c_str() очень помогает.

...