2016-03-29 3 views
-1

Мне нужен эквивалент этого для платформы Windows, пожалуйста, любые указатели? Это то, что я следовал за * NIX платформ и это, кажется, работает так far.The ссылке можно найти hereвременное перенаправление stderr на null на платформе Windows в коде c.

+1

Он должен быть похож на Windows, но вы должны '#include ' и использовать '_dup' вместо' dup', '_dup2' вместо' dup2' и т.д. –

+1

О, и вам нужно открыть '' nul '' вместо ''/dev/null "'. –

ответ

1

В качестве более расширяемой альтернативы, рассмотреть вопрос об объявлении переменной (вы могли бы назвать это error_stream?), Которые в когда вы установили значение stderr, а в другое время вы установили какой-либо другой файл (например, fopen(NUL_DEVICE_FILENAME, "wb"); в Windows NT).

Одним из приятных аспектов этого кода вы можете изменить NUL_DEVICE_FILENAME (или даже целые функции) в соответствии с каждой ОС; функции становятся интерфейсом, чтобы сделать менее портативным. Поведение более удобное для порта. См. Test.c (около нижней части этого сообщения), например, использование, а выход ниже - как доказательство того, что он работает. Желаем удачи с этим сниппет ... :)

error_stream.h:

#ifndef INCLUDE_ERROR_STREAM 
#define INCLUDE_ERROR_STREAM 
#include <stdio.h> 

FILE *get_error_stream(void); 
void set_error_stream(FILE *); 
void reset_error_stream(void); 
void blank_error_stream(void); 
#endif 

error_stream.c:

#include "error_stream.h" 
#define NUL_DEVICE_FILENAME "NUL" /* This worked fine for me on Win10 */ 
            /* Try "\\Device\\Null", "NUL" and * 
            * ... "NUL:" if it doesn't work, * 
            * ... or obviously "/dev/null" on * 
            * ... *nix      */ 
FILE *error_stream, *blank_stream; 
FILE *get_error_stream(void) { 
    if (!error_stream) { 
     error_stream = stderr; 
    } 
    return error_stream; 
} 
void set_error_stream(FILE *f) { 
    error_stream = f; 
} 
void reset_error_stream(void) { 
    set_error_stream(stderr); 
} 
void blank_error_stream(void) { 
    if (!blank_stream) { 
     blank_stream = fopen(NUL_DEVICE_FILENAME, "wb+"); 
    } 
    set_error_stream(blank_stream); 
} 

test.c:

#include "error_stream.h" 
int main(void) { 
    fputs("Testing\n", get_error_stream()); 
    blank_error_stream(); 

    fputs("Testing\n", get_error_stream()); 
    reset_error_stream(); 

    fputs("One\n", get_error_stream()); 
    blank_error_stream(); 

    fputs("Two\n", get_error_stream()); 
    reset_error_stream(); 
} 

C:\Users\Seb\Desktop>gcc -c error_stream.c -o error_stream.o 
C:\Users\Seb\Desktop>gcc test.c error_stream.o -o test.exe 
C:\Users\Seb\Desktop>test 
Testing 
One 

 Смежные вопросы

  • Нет связанных вопросов^_^