2015-12-29 4 views
0

привет у меня есть следующий кодкак написать консольный вывод в файл в с

int main() 
{ 
    system("netsh interface ip show addresses"); 

} 

и вывод в консоли, чтобы записать в текстовый файл или другой переменной. пожалуйста, помогите мне с этим. СПАСИБО В ADVANCE

+2

Используйте 'popen()' вместо 'system()'. –

+0

не могли бы вы объяснить, как записать его в файл – Varadharajan

+2

Как уже отмечалось, используйте 'popen' для запуска команды вместо' system'. Затем используйте любую из входных функций, таких как 'fread' и' fgets', чтобы читать из потока файлов, возвращаемого 'popen'. Затем используйте выходные функции, такие как 'write' и' fwrite', чтобы записать данные обратно в файл. – kaylum

ответ

2

, если вы используете Linux , попробуйте следующее:

system("netsh interface ip show addresses > /path/to/file 2>&1 "); 
+0

хорошо один. Но также включайте семейную версию 'exec'. 'система' является дорогостоящей. –

-1

Надеемся, что приведенный ниже код поможет решить вашу проблему. Посмотрите на man pages for the details of popen and pclose APIs.

#include <stdio.h> 
#include <stdlib.h> 
int main(void) 
{ 
    FILE *in; 
    char buff[512]; 
    if(!(in = popen("netsh interface ip show addresses", "r"))){ 
     return -1; 
    } 
    while(fgets(buff, sizeof(buff), in)!=NULL){ 
     printf("%s", buff); 
    } 
    pclose(in); 
    return 0; 
} 
+0

Как насчет объяснения? ОП изучит ** ничего ** из кода, не понимая его. – Downvoter

+0

И тогда код даже плох. Объявление функции в определении функции? В самом деле? Почему 'exit (1);' if 'return 1;' делает это и почему не переносит 'return EXIT_FAILURE;'? – Downvoter

+0

Ему нужно посмотреть страницы руководства API, чтобы понять код. По крайней мере, некоторые усилия должны быть поставлены с его стороны, не так ли? – sreeyesh

1
void do_popen() 
    FILE *pf; 
    char command[200]; 

    // Execute a process listing 
    sprintf(command, "netsh interface ip show addresses"); 

    // Setup our pipe for reading and execute our command. 
    if(!(pf= popen(command, "r"))){ 
     exit(EXIT_FAILURE); 
    } 

    if (pclose(pf) != 0) 
     fprintf(stderr," Error: Failed to close command stream \n"); 

    return; 
} 

Здесь мы используем POPEN который внутренне создает процесс и запустить команду, данное ему. Он возвращает поток ввода-вывода, откуда данные могут быть получены позже. read и write системные вызовы используются при чтении из заданного командного буфера или записи в файл обратно

Чтобы сделать его более общим, вы можете передать команду в параметре функции и вернуть данные, хранящиеся в файле, в динамический массив.

Хотя это делается красиво, используя popen, но он создает отдельный процесс, в котором он запускает эти команды как команды sh, а затем помещает их в файл и перед возвратом указателя файла он закрывает весь процесс.

Я предпочел бы реализовать свой собственный дочерний процесс с помощью fork(), а затем использовать exec и реализовать собственный SIGCHILD обработчик, чтобы удалить его из зомби и продолжать обрабатывать другую работу параллельно, а не блокировать процесс

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