Gdy używasz scanf() i jego wariantów, specyfikator formatu %i
przyjmuje dane w postaci heksadecymalnej (prefiks "0x"), ósemkowy (prefiksowany "0") lub dziesiętny (bez przedrostka), więc na przykład ciągi "0x10" , "020" i "16" są konwertowane na liczbę całkowitą z wartością dziesiętną 16.Czy `std :: istream :: operator >>()` może przyjmować prefiksy w postaci liczb całkowitych jak np. Specyfikator formatu% i stdio?
Czy można to zrobić przy użyciu sformatowanego wejścia std::istream::operator>>
?
Plain >> i
bez manipulatora I/O „0x10” jest zamienione na zero (lub raczej prowadzi 0 znaczy „x10” część nie jest wykonywana) i „020” do 20. hex
, oct
i dec
Manipulatory zachowują się odpowiednio: %x
, %o
i %d
. Szukam ogólnego wejściowego manipulatora wejściowego, który działa jak %i
.
Co ciekawe, manipulator hex
akceptuje zarówno "0x10", jak i "10", dokonując konwersji do 16 miejsc po przecinku.
W przypadku, gdy zastanawiasz się, wdrażam narzędzie do oceny ekspresji i chciałbym, żeby operandy całkowite były szesnastkowe, ósemkowe lub dziesiętne, używając konwencji prefiksów C/C++. Obecna implementacja przy użyciu sscanf()
robi to automatycznie przy użyciu %i
i jestem ciekawy, czy można to zmodyfikować, aby użyć iostream bez konieczności jawnego analizowania formatu liczbowego.
Interestin. +1. Zastanawiam się, czy w książce C++ IOStreams i Locales jest coś takiego ... –
Ponieważ jestem prawie w 100% pewny, że nie ma bezpośredniego odpowiednika, uważam, że najmodniejsze i najbardziej pilne rozwiązanie byłoby wdrożenie nowego manipulatora postaci 'std :: ios_base & integer (std :: ios_base & str);' – Clifford
@Johannes ma odpowiedź, która zapewnia również sposób implementacji powyższego manipulatora. – Clifford