Dlaczego stringstream::seekg nie przewija do początku?

0
#include <string>
#include <sstream>
#include <iostream>

using namespace std;

int main()
{
    string s = "Ala ma kota.";
    stringstream ss(s);
    string sink;
    while(ss >> sink);
    ss.seekg(0);
    ss >> sink;
    cout << sink << '\n';
    return 0;
}

Odpowiedź: kota. https://wandbox.org/permlink/svtwZuiUKWB8hDI8

Nie rozumiem, jeśli dobrze czytam dokumentację to seekg(0) winno przewijać do samego początku? A więc na Ala a nie kota.

Natknąłem się na to podczas pisania programu / żartu na forum, mianowicie https://4programmers.net/Forum/C_i_C++/317550-oddzielanie_slow_w_stringu_i_przypisywanie_ich_do_tablicy?p=1536160#id1536160

Działa dla ponownej inicjalizacji: ss = std::stringstream(zdanie);, nie działa dla ss.seekg(0).

4

Męczysz ten strumień aż do awarii a potem się dziwisz, że nie chce reagować.
Dodaj clear przed seekg i będzie działać.
https://ideone.com/DHeC5O

4

Dobrze ci @vpiotr gada
Wystarczy usunąć while i też działa https://wandbox.org/permlink/5jMVMUSwCPWGrxgz
Twój kod:

  1. tworzy strumień z danymi
  2. czyta dane aż do napotkania końca, więc ustawiana jest flaga eof
  3. seek (który jest ignorowany z powodu błędu)
  4. próbuje czytać dane, ale z powodu flagi eof instrukcja ta nic nie robi.
  5. wyświetlana jest ostatnia wartość sink, czyli wynik ostatniego poprawnego wykonania while
0
vpiotr napisał(a):

A sprawdź jakie flagi są aktywne.

Rzeczywiście także fail. Moja wina zatem. Bez sensu założyłem że będzie ustawiony tylko i wyłącznie eof.

vpiotr napisał(a):

A zachowanie które opisujesz wg ww strony obowiązuje od C++11. Być może używasz starszego standardu.

Nie - snippet z linka używa nowszego.

MarekR22 napisał(a):

Wystarczy usunąć while i też działa https://wandbox.org/permlink/5jMVMUSwCPWGrxgz

Tak oczywiście, ale o to mi właśnie chodziło by móc czytac ze stringstreama 2 razy, za każdym razem od początku do końca. Jak usunę while'a to czytam jeden raz - działa ale nie o to mi chodziło.

MarekR22 napisał(a):
  1. czyta dane aż do napotkania końca, więc ustawiana jest flaga eof
  2. seek (który jest ignorowany z powodu błędu)

Zgodnie z zalinkowaną przeze mnie dokumentacją seekg NIE powinien być ignorowany z powodu flagi eof tylko winien ją czyścić. Dlatego niedziałanie mojego kodu mnie konfudowało

1 użytkowników online, w tym zalogowanych: 0, gości: 1