wie funktioniert basic_ios::snyc_with_stdio
-
ich frag mich jetzt schon seit längerem, was und vorallem wie sync_with_stdio die streams verändert, ich hab schon einige docus abgesucht, google befragt, und im source von basic_ios gesucht(natürlich war nur der funktionsprototyp aufgeführt, die funktion selber suchte ich vergebens).
stimmt meine vermutung, dass beim aktivierten sync immer nur ein byte eingelesen wird, und wenn es deaktiviert ist, es im ermessen der streams/buffer liegt, wieviel sie auslesen,dh ob sie vielleicht noch ein paar bytes im speicher halten?
-
Synchronizes the C++ streams with the standard I/O system. The first time this function is called, it resets the predefined streams (cin, cout, cerr, clog) to use a stdiobuf object rather than a filebuf object. After that, you can mix I/O using these streams with I/O using stdin, stdout, and stderr. Expect some performance decrease because there is buffering both in the stream class and in the standard I/O file system.
After the call to sync_with_stdio, the ios::stdio bit is set for all affected predefined stream objects, and cout is set to unit buffered mode.
MfG SideWinder
-
The first time this function is called, it resets the predefined streams (cin, cout, cerr, clog) to use a stdiobuf object rather than a filebuf object.
mit andren worten, die c++ streams werden in ihren normal zustand resettet?
Expect some performance decrease because there is buffering both in the stream class and in the standard I/O file system.
aber das verwirrt mich,wenn die c++ streams gebuffert sind, heisst das ja, dass sie immer blockweise von stdin lesen, bzw nach stdout schreiben, wie ist dann garantiert, dass bei einer mischung von c und c++ strömen die daten in der richtigen reihenfolge ausgelesen werden?
-
ich denke mal, die flushen einfach beim synchronisieren auch die Stdio Handles.
dürfte ungefähr so implementiert sein
template<typename Char,class Traits> virtual int stdio_sync_filebuf<Char,Traits>::sync() { std::fflush(stdout); std::fflush(stderr); //... }
-
klar, flushen werden sie das sicher auch, aber das hauptproblem ist mir nochnicht klar:
wenn cin blockweise liest, dh mal die nächsten 100 zeichen aus stdin, dann ist der lese zeiger von stdin mal eben 100 stellen weiter,dh ein späterer aufruf irgendeiner lesefunktion über stdio würde am 101. byte beginnen, aber nicht am ersten wie vielleicht beabsichtigt.
wie handlen die buffer das, dass sie synchron mit stdin/stdout bleiben?
-
Einige Erklärungen, wenn auch nicht alle: