istream_buf zauber ?
-
Hallo,
istream input;
istream_buf<char> aa(input), bb;
copy(aa,bb,back_insert(to_my_string));Ich frage mich warum weiss istream_buf das bb auf input's ende zeigen soll ?
Gruss
templated
-
istream_buf? Meinst du istream_iterator? Falls ja: bb muss doch gar nicht auf irgendein Ende zeigen. Der Vergleich mit einem default-konstruierten istream_iterator ist halt als Abfrage auf EOF implementiert.
-
ja ich meinte istream_iterator... sollte der denn nicht auf das ende (+1) des array's zeigen ?
gruss
Templated
-
Welches Arrays?
-
das character array von istream_iterator.
-
Wenn du nicht bereit bist, von deinen vorgefertigten Ansichten auch nur einen Millimeter abzurücken, kann ich dir nicht helfen.
-
Der istream_iterator zeigt auf gar kein Array - der übersetzt eine Dereferenzierung in einen >> Aufruf für den drunterliegenden Stream. Und wie Bashar schon sagte, ist der default-konstruierte Stream-Iterator (per Definition) identisch zu einem Iterator, dessen Stream das failbit gesetzt hat.
-
Achso...
wenn ich das richrig verstehe, werden also nicht die Addressen sonder dessen inhalt verglichen. Und weil ein stream mit EOF endet wird am ende iterator.begin == (streambuf_iterator default constucor instanz) sein.
Dies wir wohl nicht bei allen Iteratoren gleich sein ? Ein list<char>::iterator wird z.b. die adressen von begin und end vergleichen ? oder gibt es iteratoren die per default eine 0 (string teminator) setzen ?Gruss
templated
p.s. Dumme fragen gibt es nicht

-
Wie der Vergleich definiert ist, hängt vom jeweiligen Iterator-Typ ab. Bei list<>::iterator (oder anderen Containerklassen) vergleichen die Operatoren tatsächlich, ob auf das selbe Objekt gezeigt wird. Deshalb übergibst du da als Endekennung auch l.end() - der Iterator hinter das letzte Element der Liste. IStream-Iteratoren sind halt dann "gleich", wenn sie entweder beide auf der selben Datei lesen oder beides EOF-Iteratoren sind.