Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > стандартное устройство вывода


Автор: TeeT 22.12.2005, 17:42
Можно ли менять стандартное устройство вывода, но не явно? (вывод в файл без функций работы с файлом). В смысле экран - stdout определен как FILE, а пишем мы на него printf-ом, иоли я чего то недопонимаю smile

Автор: TeeT 22.12.2005, 18:00
Из stdio.h определение устройств
Код

extern  FILE        _RTLENTRY _EXPDATA _streams[];
extern  unsigned    _RTLENTRY _EXPDATA _nfile;

#define stdin   (&_streams[0])
#define stdout  (&_streams[1])
#define stderr  (&_streams[2])

а вот определение функции
Код

#define putchar(__c)  putc((__c), stdout)

Автор: nworm 22.12.2005, 20:26
В консоли linux-а можно так приложения выполнять:

prog > outfile

вместо

prog

и printf пишет в файл outfile, после выполнения можно просматривать результаты (может это и не то, что здесь требуется smile ).

Автор: TeeT 23.12.2005, 09:25
Цитата

В консоли linux-а можно так приложения выполнять:
prog > outfil

в винде так тоже можно. Слышал о конкурсе IOCCC, проводится каждый год, ну так вот у меня прога есть с конкурса она создает три файла притом там нет ни одного fopen-a, fclose-a ну и так далее... а исходник совсем непонятный smile

Автор: azesmcar 23.12.2005, 09:49
TeeT

При запуске программы она автоматически создает три файловых дескриптора..
stdin, stdout и stderr

когда ты делаешь fopen создается очередной дескриптор...и их все можно спокойно менять местами в линуксе функции dup() и dup2.
Причем тоже самое (в линуксе, в виндоузе не знаю, не пробовал) можно сделать с любым дескриптором...например сокет. Можешь перенаправить весь stdin в socket...и все что получае программа через stdin будет отправляться по сети тому с кем присойденен твой сокет...

Автор: TeeT 23.12.2005, 10:44
azesmcar

Спасибо, интересно почему так не работает
Код

#include <stdio.h>
#include <io.h>

int main(int argc, char* argv, char *env[])
{
 int i;
 FILE *out;
 out = fopen("out.txt", "w");

 *(_streams + 1) = *out;
// dup2( out->fd, _streams[1].fd);

 printf("flags  bsize  fd");
 for(i=0;_streams[i].flags;i++)
  printf("\n%5d %5d %5d", _streams[i].flags, _streams[i].bsize, _streams[i].fd);

 fcloseall();
 return 0;
}

интересно как именно работает dup2, гда можно достать исходник?

Автор: Romikgy 23.12.2005, 10:53
SetStdHandle юзай

Автор: azesmcar 23.12.2005, 11:11
Цитата
      #include <unistd.h>

      int dup(int oldfd);
      int dup2(int oldfd, int newfd);

DESCRIPTION
      dup and dup2 create a copy of the file descriptor oldfd.

      After successful return of dup or dup2, the old and new descriptors may
      be used interchangeably. They share locks, file position  pointers  and
      flags;  for example, if the file position is modified by using lseek on
      one of the descriptors, the position is also changed for the other.

      The two descriptors do not share the close-on-exec flag, however.

      dup uses the lowest-numbered unused descriptor for the new  descriptor.

      dup2  makes  newfd  be the copy of oldfd, closing newfd first if neces-
      sary.

RETURN VALUE
      dup and dup2 return the new descriptor, or -1 if an error occurred  (in
      which case, errno is set appropriately).



Код

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(int argc, char* argv, char *env[])
{
 int i = open("out.txt", O_RDWR|O_CREAT );

 dup2( i, 1 );

 printf("Hello world!!!\n");

 close(i);

 return 0;
}


Это код под юникс, под виндоуз не могу, у меня его нет smile т.е. виндоуз есть, компилятора нет!

Автор: TeeT 23.12.2005, 15:04
azesmcar
Пасибо
Если хочешь вот есть компилер хороший:
http://www.bloodshed.net/dev/devcpp.html
ну или сразу Dev-C++ 5.0 beta 9.2 (4.9.9.2) (9.0 MB) with Mingw/GCC:
http://prdownloads.sourceforge.net/dev-cpp/devcpp-4.9.9.2_setup.exe

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)