Może odpowiem od końca.
Tak banalne programy o jakie “rozbijają się” użytkownicy na tym forum można zrobić na przynajmniej kilka sposobów, praktycznie zawsze lepiej niż sugerują autorzy wątku. Staram się odpowiadać na większość, póki starcza mi czasu i siły. Bo czasem problemy są rozbrajające.
Nie odpowiadam ani najlepszym ani jedynym słusznym (jakikolwiek on jest) kodem. Staram się sugerować drobne usprawnienia i podpowiadam rozwiązania. Stawiam na małe kroki, bo nie zależy mi na tym by utrudnić zrozumienie problemu ludziom, którzy mimo blisko zerowej wiedzy chcą programować. Większość “programów” rozpiswanych tutaj można streścić w kilku linijkach, mimo iż “prototypy” mają ich kilkadziesiąt. Jasne, mogę tak robić, ale jeśli ktoś ma wątpliwości gdzie postawić średnik to skrót myślowy na dziesięć linii takiej osobie zupełnie się nie przysłuży.
Jasne, że bufor kosztuje. Szczególnie automagiczna klasa string. Osobiście stronię od iostream i klas automatycznych w większości przypadków. Ale gro osób tutaj czyta Symfonię a Grębosz jest proponentem wszystkiego co obiektowe. A wracając do bufora: jako że iostream nie używam a i nie mam czasu na wertowanie dokumentacji API, którego tykać nie chcę, o get() najzwyczajniej w świecie zapomniałem (lub nie znałem - nie pamiętam nawet kiedy ostatnio używałem iostream).
Odpowiedzi “dlaczego nie łączyć” nie było, bo nikt się tematem nie zainteresował i każdy tą informację “olał”. Powodów jest kilka. Zacznijmy od wyrabiania dobrych nawyków. Po grzyba dwie biblioteki wykonujące to samo - IO? conio jest uzupełnieniem stdio, więc te dwie wykorzystywać wspólnie wolno. Choć generalnie używanie conio to moim zdaniem strata czasu. Standard Borlanda to nie standard.
Powód drugi: ponieważ zapis danych na ekran lub do pliku nie koniecznie odbywa się synchronicznie. Nie ma gwarancji, że np. powrót z funkcji printf() jest równoznaczny z wyświetleniem obrazu na ekranie (czy w przypadku fprintf - zapisem do pliku). Implementacja bibliotek nie jest narzucona, narzucony jest wyłącznie interfejs. Biblioteka może swobodnie dane buforować (szczególnie byłoby to korzystne przy zapisie do pliku przy wykorzystaniu suboptymalnego zapisu po znaku).
W przypadku, gdy biblioteka buforuje zapis, mieszanie wyjścia przy użyciu np. stdio i iostream może zaowocować tym, że teksty na ekranie (w pliku) pojawią się w innej kolejności niż sugerowałby kod.
stdout jest globalnym, współdzielonym uchwytem a zapis na ekran jest synchroniczny i szybki. Uruchamiając aplikację z przekierowaniem strumienia do pliku, wszystkie te założenia można włożyć między bajki. Zapis do udziałów sieciowych pod Windowsem jest asynchroniczny i wolny.
Witam na forum.