2014-11-15 5 views
1

Я хочу выполнить некоторую функцию C в C++. Функция принимает FILE * в качестве аргумента:Перенаправить FILE * stdout в строку в C++

void getInfo(FILE* buff, int secondArgument); 

Вы можете сделать это, чтобы печатать на стандартный вывод:

getInfo(stdout, 1); 
// the function prints results into stdout, results for each value secondArgument 

Но как сделать эту функцию для печати на поток или stringstream в C++, обрабатывать результаты? Я хочу захватить то, что функция печатает, в строку и выполнить некоторую обработку в полученной строке.

я попробовать что-то вроде этого:

for (i=0; i<1000; i++) { 
    getInfo(stdout, i); 
    // but dont want print to stdout. I want capture for each i, the ouput to some string 
    // or array of strings for each i. 
} 
+3

Вы можете ассоциировать файл '*' к трубе, либо путем создания трубы специальный файл (на Windows, это называется именованным каналом) и использует его путь с 'fopen' или через преобразование fd-to -FILE *', специфичное для ОС. Затем прочитайте с выходного конца трубы в свою строку. В Linux у вас также есть возможность создать временный файл на жестком диске tmpfs, который является «файловой системой», но работает со скоростью ОЗУ без касания диска. –

+0

Но как? Любой пример Linux? – user3654650

+0

Какой вариант вы интересуете? Именованная труба? Анонимная труба? Или файл tmpfs? –

ответ

2

В Linux, лучше всего анонимна трубы.

Во-первых, создать канал:

int redirectPipe[2]; 
pipe(redirectPipe) 

Затем откройте дескриптор файла, возвращаемый к нам через трубу (2) с помощью fdopen:

FILE* inHandle = fdopen(redirectPipe[0], "w"); 
FILE* outHandle = fdopen(redirectPipe[1], "r"); 

Вызвать функцию:

getInfo(inHandle, someValue); 

Затем прочитайте, используя outHandle, как если бы это обычный файл.

Одно дело быть осторожным: у труб фиксированный размер буфера, и если есть возможность для функции getInfo заполнить буфер, у вас будет тупик.

Для предотвращения тупика вы можете либо позвонить getInfo из другой нити, либо увеличить размер буфера трубы, используя fcntl и F_SETPIPE_SZ. Или лучше, как отметил Бен Вейгт в комментариях, создайте временный файл.

Примечание: Я был специфичным для * NIX, так как OP отметил он/она хотела «лучшей в Linux»

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