Я читал о freopen()
и понял, что если мы укажем для него stdin/stdout, функция будет работать, даже если мы будем кодировать, используя cin/cout.
Немного изучив, я нашел эту ссылку freopen(), эквивалентную потокам С++, где один из пользователей ответил:
Из стандарта C++ 27.3.1:
«Объектcin
управляет вводом из буфера потока, связанного с объектомstdin
, объявленным в<cstdio>
».
Таким образом, согласно стандарту, если мы перенаправляемstdin
, он также перенаправитьcin
. Наоборот дляcout
.
Также видел нечто подобное на CPPReference:
http://en.cppreference.com/w/cpp/io/cin
http://en.cppreference.com/w/cpp/io/cout
Глобальные объекты std::cout и std::wcout управляют выводом в буфер потока типа, определяемого реализацией (производного от std::streambuf), связанного со стандартным потоком вывода C stdout.
Вот тут-то и возникло некоторое замешательство, так как я также читал о флешах и заметил, что fflush(stdout) просто не будет работать с cin/cout.
Например, этот пример кода ничего не напечатает:
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cout << "Please, enter a number: \n";
fflush(stdout);
cin >> n;
}
Пока этот код ниже будет печатать в output.txt:
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
freopen("output.txt", "w", stdout);
cout << "Some string";
while (true);
}
Удалив ios::sync_with_stdio(false);
из первого примера кода, он ведет себя так, как ожидалось. И freopen()
работает в любом случае (с ним или без него).
Итак, вопрос: почему fflush(stdout) не работает с iostream, а freopen(..., stdout) работает? Может быть, этот вопрос может стать еще глубже: какое расширение cin/cout связано с stdin/stdout?
Простите за длинный пост. Я старался быть максимально подробным и кратким.
Надеюсь понятно.
Заранее спасибо.
P.S.: ios::sync_with_stdio(false);
и cin.tie(0);
поставил специально.