2017-11-22 22 views
0

내 모듈에서 "사용하기 쉬운"출력 리디렉션을 작성하려고했습니다. 어떤 파일과 stdin 사이에 fprintf의 출력을 변경한다고 가정합니다. `stdin` 매크로 선언을 어디에서 찾을 수 있습니까?

void _connection(char mode) { /* pass 'v' as an argument to set verbous mode*/ 
     FILE *stream 

     if (mode == 'v') 
     fopen(stream, "stdin location?"); 
     else 
     fopen(stream, "../stream"); 

     fprintf(stream, "Connecting to the queue..."); 
     ... 
     fprintf(stream, "Some detail information..."); 
     --- 

내 시스템을 검색 내가 어떤 표준 입력 선언을 찾을 수 없습니다 있었다 : 그래서 내가 좋아하는 뭔가에 대해 생각하고. 내 시스템에서 stdio.h 소스 파일이이 매크로를 사용하고 있지만 가져올 수 없습니다. 이 파일에는 stdin이라는 입력 파일이나 매크로가 없습니다.

+0

@EugeneSh. 달려있어. – iBug

+0

@iBug 예, 매크로 일 수 있습니다. –

답변

1

은 (유닉스) 여기 찾기 :

/usr/include/stdio.h 

또는 Windows를 :

(Compiler Path)\include\stdio.h 

ISO C 표준은 POSIX가 그들을 필요로하면서 stdin/stdout/stderr가 매크로로 필요로하는 것으로 외부 FILE* 식별자 여야하므로 POSIX 호환 시스템 (Linux 및 기타)에서 볼 수 있습니다.

#define stdin stdin 
+1

C 표준 (모든 버전)은 매크로가 필요합니다. "FILE 포인터 유형"의 표현식이며 각각 FILE 객체 이 표준 오류, 입력 및 출력과 관련되어 있음을 나타냅니다. 스트림. " – Lundin

+0

POSIX는 C 표준과의 모순을 피하고 매크로도 필요합니다. _ [[]] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdio.h.html) 헤더는 다음과 같은 매크로를 정의해야합니다. 다음과 같이 표준 오류, 입력 및 출력 스트림과 연관된 FILE 오브젝트를 가리키는 "FILE에 대한 포인터"유형의 표현식으로 확장하십시오.'stderr' 표준 오류 출력 스트림. 'stdin' 표준 입력 스트림. 'stdout' 표준 출력 스트림 ._. '#define stdin stdin' 등의 매크로는 멈추지 않습니다. Mac에서는 내부 이름 인'#define stdin __stdinp'에 매핑됩니다. –

0

stdin 매크로는 stdio.h 또는 결국 포함되는 파일에 정의되어 있습니다. 언제 까지나 #include <stdio.h>에 액세스 할 수 있습니다.

당신이하는 일을 위해 별도의 열기를 수행 할 필요가 없습니다. 파일 포인터에 stdin을 복사하십시오.

if (mode == 'v') 
    stream = stdin; 
    else 
    fopen(stream, "../stream"); 
+0

아니요, stdin 매크로는 stdio.h, period에 정의됩니다. 이것은 7.21.1에 명시되어있다. – Lundin

+1

@Lundin''헤더가 전부'#include '로 구성되어 있고'stdin'을 정의하고 있다면, 나는'stdin'을 정의하는''으로 자격이 있다고 주장 할 것입니다. –

+0

그러나'fclose (stream)'을 할 시간이되면,'stream = stdin;'을 미리 설정해 놓고 싶지 않을 수도 있습니다. – rici