2016-10-11 16 views
1

Я хочу сохранить некоторую информацию в текстовом файле, я написал эту программу:Пустой файл при использовании Sprintf и функции системы на C

#include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 


int main(int argc,char *argv[]) 
{ 
    FILE *fichier; 
    char buffer[20]; 
    char command[200]; 
    char command1[100]; 


    system(" cat /etc/resolv.conf | grep nameserver | awk -F' ' '{print $2}' | cut -d'.' -f1-3 | awk '{print $1\".1\"}' > ethernet_dns.txt"); 

    fichier=fopen("ethernet_dns.txt","r"); 
    memset(&buffer,0,sizeof(buffer)); 
    fread(buffer,20,1,fichier); 
    printf("buffer is: %s",buffer); 

    snprintf(command,sizeof(command),"ping -c 1 -W 1 %s > /tmp/ping_result",buffer); 
     printf("command is: %s",command); 

    system(command); 


    return 0; 
} 

Результаты:

команда возвращает
buffer is: 127.0.1.1 
command is : ping -c 1 -W 1 127.0.1.1 

система это :

PING 127.0.1.1 (127.0.1.1) 56(84) bytes of data. 
64 bytes from 127.0.1.1: icmp_seq=1 ttl=64 time=0.115 ms 

--- 127.0.1.1 ping statistics --- 
1 packets transmitted, 1 received, 0% packet loss, time 0ms 
rtt min/avg/max/mdev = 0.115/0.115/0.115/0.000 ms 

Но когда я бегу: кот /tmp/ping_result.I получил пустой файл

+1

Добавьте несколько отпечатков между ними. Или используйте отладчик. –

+0

Проверьте возвращаемые значения вызовов функций, особенно вызовы 'system()' в этом случае. –

+0

@JohnBollinger: Я отредактировал сообщение –

ответ

0

посланной код имеет несколько проблем

1) выводит результаты ping на стандартный вывод, а не /tmp/ping_result

2) не удаляется символ новой строки из массива buffer[]

Следующий код

1) очищает отступов

2) исправляет проблемы в коде

3) обрабатывает возможный сбой вызова fopen()

4) устраняет ненужную окончательное утверждение: return 0

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


int main(void) 
{ 
    FILE *fichier; 
    char buffer[20]; 
    char command[200]; 



    system(" cat /etc/resolv.conf | grep nameserver | awk -F' ' '{print $2}' | cut -d'.' -f1-3 | awk '{print $1\".1\"}' > ethernet_dns.txt"); 

    fichier=fopen("ethernet_dns.txt","r"); 
    if(!fichier) 
    { 
     perror("fopen for ethernet_dns.txt failed"); 
     exit(EXIT_FAILURE); 
    } 

    // implied else, fopen successful 

    memset(buffer,0,sizeof(buffer)); 
    size_t len = fread(buffer,1, sizeof(buffer),fichier); 
    printf("len is: %lu\n", len); 
    buffer[len-1] = '\0'; // eliminates trailing newline 
    printf("buffer is: %s\n",buffer); 

    snprintf(command,sizeof(command),"ping -c 1 -W 1 "); 
    strcat(command, buffer); 
    strcat(command, " > /tmp/ping_result"); 
    printf("command is: %s\n",command); 

    system(command); 
} 

полученный вывод, на мой компьютер, находится в файле: /tmp/ping_result

PING 127.0.1.1 (127.0.1.1) 56(84) bytes of data. 
64 bytes from 127.0.1.1: icmp_seq=1 ttl=64 time=0.046 ms 

--- 127.0.1.1 ping statistics --- 
1 packets transmitted, 1 received, 0% packet loss, time 0ms 
rtt min/avg/max/mdev = 0.046/0.046/0.046/0.000 ms 
0

Проблема: код читает '\n' в buffer[], но пытается это как часть команды. Нужно обрезать буфер. *** ниже

// Insure file is open 
fichier=fopen("ethernet_dns.txt","r"); 
assert(fichier); 

// Use fgets 
//memset(&buffer,0,sizeof(buffer)); 
//fread(buffer,20,1,fichier); 
if (fgets(buffer, sizeof buffer, fichier)) { 

    // lop off potential \n 
    buffer[strcspn(buffer, "\n")] = '\0'; // *** 

    printf("buffer is: <%s>\n",buffer); 

    int n = snprintf(command, sizeof(command), "ping -c 1 -W 1 %s > /tmp/ping_result", 
    buffer); 
    printf("command is: <%s>\n",command); 

    // Only issue command if no problems occurred in snprintf() 
    if (n > 0 && n < sizeof(command)) system(command);