freopen (stdin stdout) 상세 설명 + 인 스 턴 스

http://www.cnitblog.com/guopingleee/archive/2009/01/17/53843.aspx
한 바퀴 돌 고................................................................
이해 가 안 되면 천천히 생각해!알 수 있 을 거 야. 자세히 보면... 다 말 해 줄 거 야...
인터넷 에서 이 물건 은 좀 찾기 어렵다.
 
코드:
감사합니다! $~  y + M (v + C $g $l; U: x 'i! \' j% c '@ 2' / M 은 '/ dev / console' 을 '/ dev / tty' 로 바 꾸 면 됩 니 다. 'f7 a8 u * z1 e' k & {- \ 7 u9 h) N * D 'K5 v, l / dev / console 은 시스템 콘 솔 을 대표 합 니 다. 모든 LINUX 시스템 은 콘 솔 메 시 지 를 수신 하 는 전문 단말기 나 디 스 플레이 가 있 습 니 다. 보통' 활약 '입 니 다.가상 콘 솔 입 니 다. X Windows 시스템 에 서 는 화면 에 있 는 특수 한 콘 솔 창 입 니 다.  ]2 w, m) A. x) G3 I  a! q. t; R 3 t 'g. S2 [8 N7 F 특수 파일 / dev / tty 는 프로 세 스 제어 단말기 (키보드 와 디 스 플레이 또는 키보드 와 창) 의 별명 (논리 장치) 입 니 다.- 이 프로그램 에 제어 단말기 가 있다 면. / dev / tty 는 사용자 가 구체 적 으로 사용 하 는 가짜 단말 기 를 사용자 에 게 직접 출력 할 수 있 도록 합 니 다. 표준 출력 이 재 설정 되 어 있 는 상황 에서 이 기능 은 매우 유용 합 니 다. - n]% \ 6 d. s9 E  A1 @ (e & f3 R8 i9 B1 P8 O / dev / console 장 치 는 하나 뿐 이지 만 / dev / tty 를 통 해 가능 한 물리 장 치 는 셀 수 없 이 많다.
 
freopen 이후 표준 핸들 을 어떻게 복구 합 니까?
By skywind
보통 freopen 을 사용 하여 입력 / 출력 을 파일 로 바 꿀 수 있 습 니 다. 예 를 들 어 [CPP] freopen ("in. txt", "r", stdin), freopen ("out. txt", "w", stdin), [/ CPP]
그러나 표준 핸들 을 나중에 복구 할 수 있 는 완전히 호 환 되 는 솔 루 션 은 존재 하지 않 습 니 다. C 표준 라 이브 러 리 에 서 는 어 쩔 수 없습니다. 표준 콘 솔 장치 파일 을 다시 여 는 방식 이 생각 나 기 쉽 지만 안 타 깝 게 도 이 장치 파일 의 이름 은 운영 체제 와 관련 이 있 습 니 다.
  • DOS / Win 에서 이 이름 은 CON 이 므 로 [cpp] freopen ("CON", "r", stdin) [/ cpp]
  • 을 사용 할 수 있 습 니 다.
  • linux 에서 컨트롤 러 장 치 는 / dev / console [cpp] freopen ("/ dev / console", "r", stdin) [/ cpp]
  • 또한, 유 닉 스 시스템 에 서 는 dup 시스템 호출 을 사용 하여 원본 stdin 핸들 을 미리 복사 할 수 있 습 니 다.
    C + + 의 스 트림 라 이브 러 리 를 사용 하면 free open 효 과 를 얻 을 수 있 고 쉽게 회복 할 수 있 습 니 다. 스 트림 을 사용 하 는 rdbuf 입 니 다. 예 를 들 어:
    [CPP] ofstream outf(”out.txt”); streambuf *strm_buf = cout.rdbuf(); cout.rdbuf(outf.rdbuf()); cout << “write something to file”; cout.rdbuf(strm_buf); //recover cout << “display something on screen”; [/CPP]
    = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =).   == NULL)   fprintf(stderr, "error redirectingstdout");   /* this output will go to a file */   printf("This will go into a file.");   /* close the standard output stream */   fclose(stdout);   return 0;   }= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =   현재 주요 캐 시 특징 은 stdin 과 stdout 은 줄 캐 시 이 고 stderr 는 캐 시 되 지 않 습 니 다. stdout 시 파일 을 C 프로그램 에서 다시 설정 한 다음 원본 stdout 과 같은 프로그램의 더 높 은 위 치 를 복원 하 는 방법 을 소개 합 니 다. C 함 수 는 보통 stdout 이나 stdin 을 free open () 으로 재 설정 하 는 데 사 용 됩 니 다.. stdout 을 파일 이름 FILE. TXT 로 변경 하려 면 다음 호출 을 사용 하 십시오.
     freopen( "file.txt", "w", stdout ); //         "file.txt"

    이 문 구 는 모든 후속 출력 을 파일 FILE. TXT stdout 으로 이동 합 니 다. 기본 stdout 을 표시 하 는 stdout 으로 돌아 가 려 면 다음 호출 을 사용 하 십시오.
       freopen( "CON", "w", stdout ); //      "CON"

    이 두 가지 상황 에서 free open () 을 검사 하여 실제 발생 하 는 반환 값 을 확인 합 니 다. 다음은 짧 은 프로그램 이 stdout 시 방향 을 바 꾸 는 것 을 보 여 줍 니 다.
    실행 코드[color=blue]-(dearvoid@LinuxEden:tty3)-(~/tmp)-
    [26047 0] #[/color] cat freopen.c
    #include <stdio.h>
    #include <unistd.h>

    int
    main()
    {
        FILE *fp;
        char buf[1024];
        char tty[32];

        ttyname_r(fileno(stdin), tty, sizeof(tty));

       
    fp = freopen("./freopen.c", "r", stdin);
        fgets(buf, sizeof(buf), stdin);
        printf("%s", buf);

        fp = freopen(tty, "r", stdin);
        fgets(buf, sizeof(buf), stdin);
        printf("%s", buf);

        return 0;
    }
    [color=blue]-(dearvoid@LinuxEden:tty3)-(~/tmp)-
    [26047 0] #[/color] gcc freopen.c
    [color=blue]-(dearvoid@LinuxEden:tty3)-(~/tmp)-
    [26047 0] #[/color] ./a.out
    #include <stdio.h>
    This line is inputed by me.
    This line is inputed by me.
    [color=blue]-(dearvoid@LinuxEden:tty3)-(~/tmp)-
    [26047 0] #[/color] o

    // Compile options needed: none
    #include <stdio.h>
    #include <stdlib.h>void main(void)
    {

       FILE *stream ;

          // file.txt,
        "W" ("r" )
       if((stream = freopen("file.txt", "w", stdout)) == NULL)
           exit(-1);   
       printf("this is stdout output
    ");  
       stream = freopen("CON", "w", stdout);stdout   
       printf("And now back to the console once again
    ");
    }


    "CON" DOS .
    ==========================================
    :
    #include <stdio.h>
    #include <stdlib.h>

    void main(void)
    {
       FILE *stream ;
        char s[102400]="";
       if((stream = freopen("file.txt", "r", stdin)) == NULL) //  ( stdin , stdin  . buf) 
          exit(-1);

        fread(s, 1, 1024, stdin);  // . stdin .

       printf("%s
    ", s);  // .

    }

     

    좋은 웹페이지 즐겨찾기