Должно ли перенаправление командной строки stdout всегда также перенаправлять cout? - PullRequest
1 голос
/ 25 января 2020

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

В качестве теста я написал код ниже. Насколько я понимаю, с аргументом sync_with_stdio, установленным в true, который является значением по умолчанию, cout будет передавать свои выходные данные в stdout, и в этом случае перенаправление 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";
}

Ответы [ 2 ]

2 голосов
/ 25 января 2020

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

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

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

0 голосов
/ 25 января 2020

С cppreference (подчеркните мой):

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

sync_with_stdio:

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

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

...