Prowadzę badania nad stworzeniem własnego ostreamu i wraz z nim, aby obsłużyć bufor dla mojego ostream. Właściwie większość z nich działa, mogę wstawić (< <) do mojego strumienia i uzyskać ciągi bez problemu. Robię to poprzez implikowanie funkcji wirtualnej xsputn. Jednak jeśli wprowadzę (< <) float lub int do strumienia zamiast string xsputn nigdy nie zostanie wywołany.dziedziczenie problemu ostream i streambuf z xsputn i przepełnieniem
Przeszedłem przez kod i widzę, że strumień wywołuje funkcję do_put, a następnie f_put, która ostatecznie próbuje umieścić znak float 1 w buforze. Mogę go wezwać do wywołania mojej implementacji przepełnienia funkcji wirtualnej (int c), jeśli opuszczę mój bufor bez spacji i tym samym otrzymam dane dla float i int.
Teraz jest problem, muszę wiedzieć, kiedy float zostanie umieszczony w buforze. Innymi słowy, muszę wiedzieć, kiedy to ostatni raz, kiedy zostanie przepuszczona konkretna wartość. Powodem, dla którego działa xsputn, jest to, że otrzymuję całą wartość z góry i jej długość. Mogę więc skopiować go do bufora, a następnie wywołać funkcję czekającą na pełny bufor.
Niewątpliwie nadużywam projektu ostream, ponieważ muszę buforować dane wyjściowe, a następnie wysłać je wszystkie naraz dla każdej wprowadzonej wartości (< <).
W każdym razie, aby było jasne, powtórzę to, co robię w inny sposób. Jest bardzo duża szansa, że po prostu źle to wymyślę.
Chcę użyć odziedziczonego ostream i streambuf, aby móc wprowadzić wartości do niego i umożliwić obsługę konwersji typu dla mnie, a następnie chcę przekazać te informacje do innego obiektu, do którego przechodzę uchwyt do the streambuf to (for?). Ten obiekt ma drogie wejścia i wyjścia, więc nie chcę wysyłać danych 1 na raz.
Przepraszam z góry, jeśli to nie jest jasne. I dziękuję za poświęcony czas.
To, co teraz robię, co chcę wiedzieć, w zasadzie jest, jeśli nie ma w każdym razie powiedzieć, ile razy przepełnienia będzie się nazywać, lub gdy ostatni char nadchodzi. Na przykład jeśli robię mystream << 1.3f; Otrzymam znaki "1", a następnie "." następnie "3", ale wewnątrz streabuf nie mam pojęcia, ile znaków można się spodziewać. A po tym jak dostanę 3, chcę działać na buforze (zadzwoń do innego obiektu, dając mu do zrozumienia, że jest gotowy) –
Nie ma możliwości, aby kod mógł wiedzieć z góry, co zrobi kod klienta, lub ile razy to zrobi. zostanie wezwany. Możesz ustawić 'unitbuf' na' ostream': spowoduje to wywołanie 'sync' na końcu każdego' operatora << '(w destruktorze obiektu' sentry'). Następnie działasz w buforze w 'sync'. –
aha! to jest DOKŁADNIE to, czego potrzebowałem! Zaznaczając to jako odpowiedź, nie możesz jeszcze głosować, wrócę i zrobię to, gdy zdobędę wystarczającą ilość przedstawicieli. Dziękuję bardzo. –