stringstream :: seekp не работает в Visual Studio 2015

95
9

Я хочу прочитать кусок данных из файла в stringstream, который позже будет использоваться для анализа данных (используя getline, >> и т.д.). После чтения байтов я установил буфер потока строк, но не могу сделать это, чтобы установить указатель p. Я протестировал код на некоторых онлайн-сервисах, таких как onlinegdb.com и cppreference.com, и он работает. Однако в Microsoft я получаю ошибку - указатели выходят из строя.

Вот код, я заменил файл-чтение на массив символов.

#include <sstream>
#include <iostream>

int main()
{
char* a = new char [30];
for (int i=0;i<30;i++)
a[i]='-';
std::stringstream os;
std::cout << "g " << os.tellg() << " p " << os.tellp() << std::endl;
os.rdbuf()->pubsetbuf(a,30);
os.seekp(7);
std::cout << "g " << os.tellg() << " p " << os.tellp() << std::endl;
}

вывод я получаю когда он работает

g 0 p 0
g 0 p 7

вывод я получаю на visual studio 2015

g 0 p 0
g -1 p -1

какие-нибудь иды?

Спасибо

спросил(а) 2018-11-06T11:00:00+03:00 2 года, 3 месяца назад
1
Решение
61

std::sstream::setbuf может ничего не делать:

Если s - нулевой указатель, а n - ноль, эта функция не имеет никакого эффекта.

В противном случае эффект определяется реализацией: некоторые реализации ничего не делают, в то время как некоторые реализации очищают член std :: string, используемый в настоящее время в качестве буфера, и начинают использовать предоставленный пользователем массив символов размера n, на первый элемент которого указывает s, как буфер и последовательность ввода/вывода символов.

Вам лучше использовать конструктор std::stringstream для установки данных или вызвать str():

#include <sstream>
#include <iostream>

int main()
{
std::string str( 30, '-' );
std::stringstream os;
std::cout << "g " << os.tellg() << " p " << os.tellp() << std::endl;
os.str( str );
os.seekp(7);
std::cout << "g " << os.tellg() << " p " << os.tellp() << std::endl;
}

ответил(а) 2018-11-06T11:21:00+03:00 2 года, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема