2009-02-07 23 views
17

Dla celów edukacyjnych Chcę utworzyć bufor ostream i strumienia zrobić:Jak utworzyć własny strumień ostream/streambuf?

  1. fix endians robiąc < < MyVar;
  2. przechowywać w pojemniku deque zamiast używania std: cout lub zapisywanie do pliku
  3. dziennika dodatkowe dane, takie jak, ile razy zrobiłem < <, ile razy udało .write ilość bajtów I pisemne i ile razy spłukuję(). Ale nie potrzebuję wszystkich informacji.

Próbowałem przeładować, ale niestety strasznie. Próbowałem przeciążenia zapisu wykonując

ostream& write(const char* s, streamsize n) 

w mojej klasie basic_stringstream2 (I skopiowane pasty basic_stringstream w moim pliku cpp i modyfikować go), ale kod przechowywane przy użyciu basic_ostream. Przejrzałem kod i wygląda na to, że muszę przeładować xsputn (co nie jest wspomniane na tej stronie http://www.cplusplus.com/reference/iostream/ostream), ale co jeszcze muszę przeciążać? i jak skonstruować moją klasę (co musi dziedziczyć, itp.)?

+1

mógłbyś stanowić fragment kodu, który "prowadzona jest przy wykorzystaniu basic_ostream"? –

Odpowiedz

1

Nie jestem pewien, czy to, co chcesz zrobić, jest możliwe. Operatory << nie są wirtualne. Możesz więc zdefiniować yourstream &operator << (yourstream &strm, int i), aby robić to, co chcesz, z konwersją i liczeniem endianów, i zadziała, gdy twój kod wywoła go bezpośrednio. Ale jeśli przekażesz swój obiekt do funkcji, która oczekuje ostream, za każdym razem, gdy ta funkcja wywoła <<, przejdzie do oryginalnej wersji ostream zamiast twojej.

Jak rozumiem, urządzenia strumieniowe zostały skonfigurowane w taki sposób, że można "łatwo" zdefiniować nowy typ strumienia, który używa innego rodzaju bufora (jak, powiedzmy, deque of chars), i możesz bardzo łatwo dodać obsługę wyprowadzania własnych klas przez <<. Nie sądzę, że masz zamiar redefiniować środkową warstwę między tymi.

W szczególności cały punkt interfejsu << polega na zapewnieniu ładnie sformatowanego tekstu wyjściowego, podczas gdy wygląda na to, że faktycznie chcesz uzyskać wyjście binarne. (W przeciwnym razie odniesienie do "endianu" nie ma sensu.) Nawet zakładając, że jest jakiś sposób robienia tego, nie wiem, w najlepszym razie będzie wytwarzał niezręczny wynik binarny. Na przykład rozważenie przeciążenia użytkownika końcowego, aby wyprowadzić punkt w przestrzeni 3D. Wersja użytkownika końcowego << prawdopodobnie wykona coś w rodzaju << '(' << x << ", " << y << ", " << z << ')'. To będzie ładnie wyglądać w strumieniu tekstowym, ale w strumieniu binarnym jest dużo zmarnowanych i zupełnie bezużytecznych znaków, które najlepiej byłoby użyć po prostu << x << y << z. (A ile połączeń do << należy liczyć jako?)

6

For A + C) Myślę, że należy spojrzeć na aspekty, modyfikują sposób, w jaki obiekty są zapisywane jako znaki. Tutaj możesz przechowywać statystyki, ile razy przesyłasz strumieniowo swoje obiekty. Sprawdź na przykład How to format my own objects when using STL streams?.

Dla B) Musisz utworzyć własne streambuf i połączyć swój ostream z tym buforem (argument konstruktora). Zobacz Luc's links + Deriving new streambuf classes. Podsumowując należy wdrożyć to dla ostream (min):

  • przelewowy (umieścić pojedynczych znaków lub bufor płukania) (link)
  • xsputn (umieścić tablicę karbonizatu bufor) (link)
  • sync (link)
+0

Większość linków w tej chwili zwisa. – Omnifarious