Мне нужен эквивалент этого для платформы Windows, пожалуйста, любые указатели? Это то, что я следовал за * NIX платформ и это, кажется, работает так far.The ссылке можно найти hereвременное перенаправление stderr на null на платформе Windows в коде c.
-1
A
ответ
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
Он должен быть похож на Windows, но вы должны '#include' и использовать '_dup' вместо' dup', '_dup2' вместо' dup2' и т.д. –
О, и вам нужно открыть '' nul '' вместо ''/dev/null "'. –