stringstream :: seekp не работает в Visual Studio 2015 - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу прочитать часть данных из файла в 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

любые иды?

спасибо

1 Ответ

0 голосов
/ 06 ноября 2018

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

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

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

Вам лучше использовать конструктор 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;
}
...