2012-04-08 4 views
1

문자열이 char* str 인 것으로 가정합니다. 나는 그것은 다음과 같은 방법으로 버퍼로 인쇄 :freopen을 사용하고 fopen을 사용하는 것이 합법적입니까?

char buf[MAX_LEN]; 
freopen("tmp","w",stdout); 
printf("%s\n",str); 
fflush(stdout); 
fp = fopen(tmp,"r"); 
if (fp == NULL) return; 
fgets(buf,MAX_LEN,fp); 
fclose(fp); 
fclose(stdout); 

이 코드 원인 무효 스트림 버퍼가 처리 할 수 ​​있습니까? freopen을 사용하고 그 후에 fopen을 사용하는 것이 맞습니까? 내 시스템의 제약에 따라 fprintfsprintf을 사용할 수 없습니다.

답변

2

이론적으로 말하면 이론상 완벽하게 합법적이며 잘 작동합니다. 그것은 그것의 man 페이지에 의하면, 주요 사용 사례입니다 :

freopen을() 함수는 이름이있는 문자열 경로가 가리키는 및 스트림이 함께 stream이 가리키는 연관 파일을 엽니 다. 원본 스트림 (있는 경우)이 닫힙니다. mode 인수 은 fopen() 함수에서와 같이 사용됩니다. 주 사용 freopen을의() 함수는 표준 텍스트 스트림과 관련된 파일 (표준 오류, 표준 입력이나 표준 출력) 실제로

을 변경하는 이다, 코드가 작동하지 않습니다 : 주로 "tmp"와 tmp & 헤더가 누락 된 오류가 있습니다. 이 코드는 것, 그것은 자동으로 읽기 '잠금'의 글에 대한 당신이 파일이있는 경우

또한
#include <stdio.h> 
#define MAX_LEN 512 

int main() { 
    const char* str = "data\n"; 
    FILE* fp; 
    char buf[MAX_LEN]; 

    freopen("tmp","w",stdout); 
    printf("%s\n",str); 
    fflush(stdout); 
    fp = fopen("tmp","r"); 
    if (fp == NULL) return; 
    fgets(buf,MAX_LEN,fp); 
    // here, buf gets str's content 
    fclose(fp); 
    fclose(stdout); 
    return 0; 
} 
+2

, @Yakov이로 실행 가능성이있는 동안, 거기에 (또는 적어도이었다) 시스템 오픈. 이 경우 일반적으로 읽기를 '열려면'시도에서 'NULL'을 반환합니다. 이것은 성가신 것입니다. 나는이 시스템을 피하려고 노력한다. :-) – torek

+1

@Coren - 헤더에 대해 분명합니다. 코드를 복제 할 필요가 없습니다. – Yakov