簡體   English   中英

在C上使用sprintf和系統函數時清空文件

[英]Empty file when using sprintf and system function on 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

system命令返回:

    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

但是當我運行時:cat /tmp/ping_result。我有一個空文件

問題:代碼正在讀取buffer[] '\\n'但仍嘗試將其作為命令的一部分。 需要修剪緩沖區。 ***下面

 // 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);

發布的代碼有幾個問題

1)的結果輸出ping到stdout而非/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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM