Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, 0xff, Вы писали:
К>Было бы проще не заморачивать себе голову, а завести ещё один глобальный поток, и дублировать туда дескриптор либо трубки, либо стдаута.
К>Грубо говоря,
К>К>// ...h
К>extern FILE* myout;
К>....
К>// ...cpp
К>FILE* myout;
К>....
К>if( use_pipe || _fileno(stdout)<0 )
К>{
К> int fds[2] = {0,0};
К> _pipe(fds, 1024, _O_BINARY);
К> myout = _fdopen(fds[1], "w");
К>}
К>else
К> myout = _fdopen(_fileno(stdout));
К>....
К>///// использование
К>fprintf(myout, "hello, %s", "world");
К>
Я для себя только что нашел более удобный способ. Можно переопределить stdin и stdout через freopen(), указав, какой-нибудь временный файл, а dup2() закроет его сам. Дескрипторы конечно будут не 0 и 1, но зато printf() будет работать без проблем. Единственное, что временный файл надо удалить будет потом. В общем, код теперь примерно такой
f = freopen("tmp.tmp","wb",stdout);
f = freopen("tmp.tmp","rb",stdin);
setvbuf(stdout,NULL,_IONBF,0);
...
int pipe_fd[2] = {-1};
if(_pipe(pipe_fd,1024,_O_BINARY) == -1){
perror("_pipe()");
}else{
if(dup2(pipe_fd[0],_fileno(stdin)) == -1)
perror("dup2(pipe_fd[0],_fileno(stdin))");
if(dup2(pipe_fd[1],_fileno(stdout)) == -1)
perror("dup2(pipe_fd[1],_fileno(stdout))");
}
...
printf("Test printf()\n");
...
char tmp[1024] = {0};
gets(tmp);
// теперь tmp == "Test printf()"
Спасибо, за помощь.