Intuitiv, aus der C++ - Spezifikation, sieht es so aus, als ob istream::putback(c)
immer den Eingabepuffer so anordnen sollte, dass der nächste Aufruf an istream::peek()
das Zeichen c
lesen sollte. Ist das nicht korrekt? Ich frage, weil die neueste Version von libC++, die mit Xcode 4.6 ausgeliefert wird, dieses Verhalten anscheinend nicht in allen Fällen erzwingt - insbesondere wenn das letzte Zeichen am EOF ist. Das gleiche gilt, wenn Sie unget()
anstelle von putback(c)
verwenden.Sollte istream :: peek() nicht immer zurückgeben, was Sie gerade putback()?
Ist das Verhalten von libC++ korrekt oder ist es meine Intuition, wie putback()/unget()
korrekt funktionieren sollte?
Betrachten Sie diesen Beispielcode, der mit libstdC++ funktioniert, aber nicht mit libC++ (die Assertion schlägt fehl).
#include <sstream>
#include <cassert>
int main(int argc, const char * argv[])
{
std::istringstream in("[Test]");
while(in)
{
int c = in.get();
if(c == ']')
{
in.putback(c);
assert(in.peek() == c); // Fails with libc++. Succeeds with libstdc++.
break;
}
}
return 0;
}
Werden 'eofbit',' failbit', 'badbit' nach dem' putback (c) 'gesetzt? (Als Referenz: Mit libstdC++ 4.7 ist keiner davon gesetzt, der Stream ist 'gut()'.) – us2012
+1 zu beiden Antworten. Sieht aus wie ein Fehler in libC++, der in r162608 behoben wurde. –