2009-12-13 5 views
4

아무 것도 가리 키지 않는 C 스트림 개체 (FILE* 개체)를 얻을 수있는 방법이 있습니까?FILE * 아무데도 안 간다

나는 fopen("/dev/null","w");이 작동하지만 더 좋은 방법이 있는지 궁금합니다.

비트는 posix 레이어보다 높은 수준에서 데이터를 버킷으로 전송하는 것이 바람직하며 이식성 또한 좋습니다.

+5

왜 이것을해야합니까? 당신이하려고하는 것을 할 수있는 더 좋은 방법이있을 것입니다. – Andrey

+0

나는'stderr'에 들어가는 로깅을 가지고 있는데 플래그로 해제 할 수 있기를 원합니다. 'fprintf'에 전달되는 변수를 변경하는 것보다 더 많은 것을 할 필요가 없습니다. – BCS

+1

http://stackoverflow.com/questions/1741191/creating-a-file-stream-that-results-in-a-string과 유사합니다. stdio 구현은 항상 그런 것들을 지원하는 것 같지만 API는 그것을 사용하는 좋은 방법을 제공하지 않습니다. – Edmund

답변

9

아니요 : Unix에서는 /dev/null이고 Windows에서는 NUL: (Cygwin이 없거나 동등하지 않은 경우)이 최선의 방법입니다.

(질문 원래 버전 fopen("/dev/null","o"); 언급하지만 사람 고정되었다.)
를 제로와 fopen()"o" 플래그가 비 - 휴대용이다. 이식 가능한 형식은 다양한 조합의 플래그 문자 r, w, a, b, +을 포함합니다.

+0

"o"플래그는 무엇을합니까? 그것은 나의 맨 페이지에 있지 않다 –

+0

"O"K, 나는 내가 그것을 봐야했다라는 것을 알고 있었다. 나는 기억에서 일하고 있었다. – BCS

+0

@Anacrolix : 나는 무엇이 '잘'할 수 없다. 그것은 휴대용이 아니며 내가 사용할 수있는 시스템에는 적용되지 않습니다 ... 나는 'w'의 변종으로 의도 된 것이라고 생각합니다. –

6

stderr로 이동하는 일부 로그인이 있으며 플래그로 해제 할 수 있기를 원합니다. 정말 오히려 인 fprintf 전달되는 변수를 변경할 것보다 더 많은 작업을 수행 할 필요가 없습니다 것

A) 래퍼 기능

logging = TRUE; 
void debugprint(...) 
{ 
    if (logging) 
    { 
     fprintf(stderr, ...); 
    } 
} 

b)는 당신이 그것을 주면 fprintf를 반환 생각 널 포인터. 기억이 안나요. 한번 해보십시오. 그럼 당신이 할 일은 포인터를 변경하는 것입니다 :

+0

a) 많은 작업을 위해 실제 로깅 시스템으로 전환 할 수 있습니다. b) +1을보고 싶을 때 – BCS

+1

b) 주변을 둘러보고 fprintf (NULL, "");가 실패합니다. – BCS

+0

fprintf (stderr)에 대한 모든 인스턴스에 대해 하나의 함수를 추가하고 search + replace 만하면됩니다. – Pod

관련 문제