LINUX.ORG.RU

(C++) Слить вывод в null


0

0

Есть код на C++, который что-то выводит.
нужно подменить stdout на null'оский поток (как /dev/null в UNIX'ах),
чтобы вывод куска программы сливался "вникуда", а потом вернуть
stdout'у прежний указатель:

...
        FILE *stdout_copy;
        stdout_copy = stdout; // копируем указатель
        stdout = NULL; // перенаправляем stdout в унитаз
        stdout = stdout_copy; // возвращаем прежний stdout
...

Такой подход сегфолтится :(, видимо на выводе в NULL,
Можно было бы подменить на пойнтер на открытый /dev/null, но оно должно компилится под виндой (minGW).

Как кроссплатформенно, временно об'NULL'ить stdout?

Спасибо!

P.S. Закомментировать printf(...)'ы прошу не прелагать :).


> Как кроссплатформенно, временно об'NULL'ить stdout?

Никак. В Unix - это /dev/null, а в винде NUL (кажется). Так что определяй препроцессорную константу BITBUCKET в зависимости от системы.

tailgunner ★★★★★
()

на низком уровне (на чистом С)
man open, man dup2
короче открываешь /dev/null и подсовываешь его вместо stdout

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

> короче открываешь /dev/null и подсовываешь его вместо stdout

Спасибо за вдумчивое чтение вопроса вопроса,

_можно было бы подменить на пойнтер на открытый /dev/null_
_но оно должно компилится под виндой (minGW)_

fifajan
() автор топика
Ответ на: комментарий от fifajan

// Тогда так, хоть это и не совсем корректно, но работает
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
   int fd;
   printf("This string writes to console\n");
   close(1);
   fd=open("NIL",O_WRONLY);
   printf("This string is invisible\n");
   return 0;
}

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

> fd=open("NIL",O_WRONLY);
Что это?

Закрыть stdout то можно, но как потом открыть?
Ладно сделаю ОС-зависимый #define "/dev/null"/"NUL".

Если найдется идея по-универсальней, не стесьняйтесь :)
Спасибо!

fifajan
() автор топика
Ответ на: комментарий от fifajan

> Если найдется идея по-универсальней, не стесьняйтесь :)

Да куда уж универсальнее? Открываешь 2 файла, а потом dup2 или прямым присваиванием stdout меняешь направление вывода между ними.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Какая-то хрень творится...

Подменил на /dev/null: выводит в консоль символы типа '~', '|', и некотрые, не все, слова. Оно еще выбирает что выводить? :\\\.

Код:
        #define NULL_STREAM "/dev/null" //"NUL"
        ...

	FILE *stdout_copy;
	FILE *null_stream;
	null_stream = fopen(NULL_STREAM, "a");
	stdout_copy = stdout;
	
	stdout = null_stream;
        ...
        ВЫВОД (printf)
        ...
        stdout = stdout_copy;


fifajan
() автор топика
Ответ на: комментарий от fifajan

Значит, действуй dup2 (только не забудь перед ним поставить fflush(stdout))

tailgunner ★★★★★
()
Ответ на: комментарий от fifajan

ёпрст - я же сказал читать про dup2 :)
пришлось вот mingw запустить, чтобы убедится, что всё что советовал - правильно, заодно приведённый пример расширил

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
   int fd;
   int back_stdout;
   printf("This string writes to console\n");
   // make backup for stdout
   back_stdout=dup(1);
   // open NUL device (/dev/null under *nix)
   fd=open("NUL",O_WRONLY);
   // close old stdout
   close(1);
   // redirect stdout => NUL
   dup2(fd,1);
   printf("This string is invisible fd=%d\n",fd);
   close(fd);
   // restore
   dup2(back_stdout,1);
   printf("This string already visible\n");
   return 0;
}

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

> пришлось вот mingw запустить, чтобы убедится, что всё что советовал - правильно, заодно приведённый пример расширил

Сегфолтится под плюсами под linux. (c "/dev/null"),
компили с помощью:

g++ (GCC) 4.1.2 20060901 (prerelease) (Debian 4.1.1-13)

fifajan
() автор топика
Ответ на: комментарий от fifajan

Создай свой класс output'a, который ничего не делает. На него и подменяй. Кроссплатформенно.

Kpoxman ★★
()

А если так:
------------------------------------------------------------------
#include <stdio.h>

typedef int (*write_function_t)(void*, const char*, int);

int my_write_function(void* p_data, const char* p_text, int p_len)
{
return p_len;
}

int main(int argc, char** argv)
{
write_function_t saved;

printf("---- text ----\n");

saved = stdout->_write;
stdout->_write = my_write_function;

printf("++++ you shouldn't see me ++++\n");

stdout->_write = saved;

printf("==== another text ====\n");

return 0;
}

binnehex
()

Если только для gcc, поковыряй glibc-шную структуру FILE, вроде там есть функции, через которые буфер сбрасывается, в них заглушку можно прописать.

Legioner ★★★★★
()

#define printf if (__LINE__ > N1 && __LINE__ < N2) printf

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.