Potrzebuję wskazówek lub wskazówek, jak zaimplementować niestandardowy ostream. Moje wymagania to:Niestandardowe ostream
- Klasa z operatorem "< <" dla kilku typów danych.
- Celem jest wysłanie danych wyjściowych do bazy danych. Każda "linia" powinna przejść do osobnego rekordu.
- Każde rekordowe najważniejsze pole to tekst (lub blob), ale niektóre inne pola, takie jak czas itp., Mogą być w większości wydedukowane automatycznie
- buforowanie jest ważne, ponieważ nie chcę przechodzić do bazy danych dla każdy rekord.
Po pierwsze, czy warto czerpać z ostream? Co otrzymuję dzięki pochodzeniu od ostream? Co jeśli moja klasa po prostu implementuje kilka metod (w tym niektóre niestandardowe typy danych). Którą funkcję otrzymuję od ostream?
Zakładając, że to, czego chcę, to klasa wywodząca się z ostream, potrzebuję wskazówek wyjaśniających związek między ostream a klasami streambuf. Którego muszę wdrożyć? Patrząc na niektóre próbki, wydaje się, że nie muszę w ogóle wyprowadzać z ostream, i po prostu dać konstruktorowi ostream niestandardowy streambuf. Czy to prawda? czy to podejście kanoniczne?
Jakie funkcje wirtualne w niestandardowym strumieniu strebuf muszę wprowadzić? Widziałem kilka próbek (w tym ta strona: here i here i kilka innych), niektóre zastępują metodę sync
, a inne zastępują metodę overflow
. Którą należy przesłonić? Ponadto, patrząc na źródła stringbuf i filebuf (Visual Studio lub GCC), obie te klasy buforów implementują wiele metod w strumieniu.
Jeśli wymagana jest niestandardowa klasa pochodna streambuf, czy istnieje jakakolwiek korzyść wynikająca z stringbuf (lub jakiejkolwiek innej klasy) zamiast bezpośrednio ze streambuf?
Jeśli chodzi o "linie". Chciałbym przynajmniej, gdy moi użytkownicy klasy używającej manipulatora "endl" będą nową linią (tj. Rekord w bazie danych). Być może - zależy to od wysiłku - każda "\ n" postać powinna być również uważana za nowy rekord. Komu mój niestandardowy ostream i/lub streambuf otrzymują powiadomienia o każdym?
Powinieneś prawdopodobnie utworzyć własną klasę 'streambuf', która obsługuje całą ciężką pracę, a następnie stwórz bardzo prostą klasę' ostream', która dziedziczy 'std :: basic_ostream' i inicjuje się za pomocą twojego obiektu' streambuf'. –
Powinieneś sprawdzić [Boost.Iostreams] (http://www.boost.org/doc/libs/release/libs/iostreams/doc/index.html) - dzięki temu tworzenie niestandardowych strumieni i buforów jest o wiele prostsze. –
Dziękuję za twoją edycję, @MarkusParker – Uri