2013-09-30 9 views
5

Próbuję znaleźć metodę, aby uzyskać liczbę znaków odczytywanych lub zapisywanych w strumieniu, który jest niezawodny, nawet jeśli wystąpił błąd, a zakończenie odczytu/zapisu jest krótkie.Czy metody Cashusa strehibuf C++ mogą generować wyjątki?

robiłem coś takiego:

return stream.rdbuf()->sputn(buffer, buffer_size); 

ale jeśli realizacja streambuf z overflow wolno rzucać excpections to nie będzie działać. Czy to jest? Nie udało mi się znaleźć go nigdzie udokumentowanego.

Odpowiedz

5

basic_streambuf::overflow może wyjątek, w przypadku awarii, jak udokumentowano w 27.6.3.4.5/6 i niestety nie ma sposobu, aby zapewnić czasie kompilacji że funkcja nie zawsze rzut wyjątek.

Wygląda na to, że kończy ci się szczęście, a jedynym sposobem, aby być w 100% pewnym, że overflow nie rzuci wyjątku, jest napisanie własnego streambuf, który nie robi tego po niepowodzeniu.


[27.6.3.4.5/2-3] int_type overflow(int_type = c = traits::eof())
...

[27.6.3.4. 5/5]

Wymaga: Co przemawia definicja tego wirtualnego funkcji powinien przestrzegać następujących ograniczeń:

1) Wpływ spożywania znak na skojarzonego wyjścia sekwencja jest specified309

2) Niech R będzie liczba znaków w oczekującej sekwencji nie została zużyta. Jeśli r jest różna od zera, wówczas pbase() i pptr() ustawia się tak, aby : pptr() - pbase() == r, a znaki r rozpoczynające się od pbase() są powiązanym strumieniem wyjściowym. W przypadku, gdy r wynosi zero (wszystkie znaki oczekującej sekwencji zostały zużyte), wówczas albo pbase() jest ustawione na NULL, albo pbase() i pptr() są ustawione na tę samą NULL inną niż wartość.

3) Funkcja może się nie udać, jeśli dołączenie jakiegoś znaku do strumienia wynikowego związanego z nie powiedzie się lub jeśli nie można ustanowić pbase() i pptr() zgodnie z powyższymi regułami.

[27.6.3.4.5/6]

Zwraca: traits::eof() lub zgłasza wyjątek, jeśli funkcja nie

+0

Niestety Piszę adapter do konwersji streambufs do innego interfejsu (Microsoft COM 'IStream'). Nie kontroluję ani nie wdrażam streambufów. – thehouse

+0

Oczywiście musi istnieć sposób na zrobienie tego. W przeciwnym razie, w jaki sposób strumień źródłowy wiedziałby, ile znaków zostało zużytych przez strumień docelowy, jeśli ten ostatni miał błąd? – thehouse

+1

@ domena operacja strumienia może się nie powieść, ale nadal można wywoływać odpowiednie funkcje, aby uzyskać informacje o strumieniu. na przykład można porównać wartość 'gptr' przed i po wywołaniu, które może zawieść ... lub podobne, powinno działać w teorii. –

Powiązane problemy