Должна ли переадресация командной строки stdout всегда перенаправлять cout?

Мне не ясно, должно ли перенаправление stdout в файл из командной строки всегда перенаправлять cout (и аналогично для stderr и cerr).

В качестве теста я написал код ниже. Насколько я понимаю, с аргументом sync_with_stdio, установленным в true, что является значением по умолчанию, cout будет передавать свой вывод на стандартный вывод, и в этом случае перенаправление stdout также перенаправит cout, и это то, что произошло при использовании VS на моем компьютере с Win10.

Однако, когда я изменил аргумент на false, все три вывода все равно были перенаправлены. Я наполовину ожидал, что будет перенаправлен только вывод printf, а вывод cout все равно будет отображаться.

Объяснение того, что происходит, будет оценено, так как я явно что-то упускаю. Спасибо!

#include <iostream>
int main()
{
   std::ios::sync_with_stdio(false);
   std::cout << "a\n";
   std::printf("b\n");
   std::cout << "c\n";
}

person BenevolentDeity    schedule 25.01.2020    source источник


Ответы (2)


Вы неправильно понимаете, что означает sync_with_stdio. Это совершенно не связано с перенаправлением, оно касается только синхронизации между двумя потоками. Если установлено значение false, два потока могут буферизоваться независимо.

Но в итоге оба потока записывают в стандартный выходной файловый дескриптор. То же самое верно для stderr и (для чтения) stdin.

Если вы хотите перенаправить std::cout, вам необходимо сбросить его буфер потока через rdbuf.

person Konrad Rudolph    schedule 25.01.2020

Из cppreference (выделить мое):

Глобальные объекты std::cout и std::wcout управляют выводом в буфер потока типа, определяемого реализацией (производного от std::streambuf), связанного со стандартным потоком вывода C stdout.

sync_with_stdio:

Указывает, синхронизируются ли стандартные потоки C++ со стандартными потоками C после каждой операции ввода/вывода.

std::cout всегда пишет на стандартный вывод.

person 463035818_is_not_a_number    schedule 25.01.2020