2012-06-08 2 views
4

Есть ли способ изменить printf, чтобы выводить строку на файл, а не на консоль?C модификация printf() для вывода в файл

Я попытался найти что-то в Интернете и нашел звонки вроде dup, dup2 и fflush, которые могут быть связаны с этим.

EDIT:

Может быть, я не ясно .. дело в том, что это был вопрос в C экзамен .. вопрос заключается в следующем:

Объясните, как программа, которая обычно выходные строки в экран (используя printf()) можно сделать для вывода строки в файл, без, изменяя любой код в указанной программе.

+0

Если вы объясните * почему * вы хотите сделать эту причудливую причудливую вещь, ответы, как правило, будут лучше. – unwind

+3

Как насчет 'fprintf'? Или используя перенаправление оболочки ('./myprogram> some_file')? –

+0

@JoachimPileborg ... спасибо за ваш ответ .. я еще раз изучу вариант перенаправления оболочки. – user1317277

ответ

5

Обычно это делается с использованием I/O-redirection (...> file).

Проверить это небольшая программа:

#include <stdio.h> 
#include <unistd.h> 

int main (int argc, char *argv[]) { 
    if (isatty (fileno (stdout))) 
     fprintf (stderr, "output goes to terminal\n"); 
    else 
     fprintf (stderr, "output goes to file\n"); 

    return 0; 
} 

[email protected]:~ $ ./x 
output goes to terminal 
[email protected]:~ $ ./x >yy 
output goes to file 
1

Используйте либо sprintf для записи в строку, либо в файл, либо fprintf.

http://linux.die.net/man/3/fprintf

+1

'snprintf' почти всегда лучший выбор, чем' sprintf', чтобы избежать переполнения буфера. –

+0

@DelanAzabani Я согласен. Просто хотел, чтобы все было просто. – user1202136

11

Если вы не имеете свободу изменять исходный код, который делает печать, вы можете использовать freopen на stdout перенаправить в файл:

stdout = freopen("my_log.txt", "w", stdout); 

Это граничит с хак, однако , потому что перенаправления из командной строки перестанут работать, как ожидалось. Если у вас есть доступ к коду, который делает печать, предпочтительнее использовать fprintf.

Вы также можете переключить stdout временно для вызова функции, а затем положить его обратно:

FILE *saved = stdout; 
stdout = fopen("log.txt", "a"); 
call_function_that_prints_to_stdout(); 
fclose(stdout); 
stdout = saved; 
+0

, так что stdout перезаписывается и выводится в файл, а не на консоль ..? – user1317277

+0

также, как вы делаете печать printf снова на консоль? – user1317277

+1

@ user1317277 Да, когда вы «freopen' ваш' stdout', вывод идет в файл. Вы не можете вернуться после 'freopen', но вы можете сохранить старый stdout и вернуть его так, как я объяснил в редактировании. – dasblinkenlight

2

Другие ответы не справляются с проблемой, не меняя кода.

Таким образом, в зависимости от окружающей среды единственное, что остается, это перенаправление stdout при вызове программы.

./program > target_file 
+0

отлично .. спасибо :) – user1317277

1

Лектор советовались, и это было правильное решение при условии (сам преподаватель):

int main { 
    int newFile = open(desiredFilePath, O_WRONLY) 
    if ((fork())==0) { 
     dup2(newFile,stdout) // Explained below 
     close newFile 
     Set stdout as CLOSE_ON_EXEC false 
     exec the user program 
    } 
    else{ 
     Wait for child 
    } 
    return 0 
} 

Логика dup2: здесь стандартный вывод установлен как копия newFile, что означает, что FD 0 теперь фактически является обязательным для пользователя файлом, а не консолью. Это связано с тем, что поведение dup 2 по умолчанию заключается в том, чтобы закрыть filedescriptor второго параметра и назначить его первому параметру.

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