2017-03-09 11 views
-3

私は 'ping'の結果を書いて欲しい。私はファイルの先頭に文字列を書きたい。しかし、それは働かない。(c)

最初に、私はコマンドラインを書いてから、残りのping結果を書きます。

このようです。データの

ピング-C5 -W1 192.168.30.52
PING 192.168.30.52(192.168.30.52)56(84)バイト。 192.168.30.52から
64バイト:icmp_seq = 1個のTTL = 64時間= 0.368秒192.168.30.52から
64バイト:icmp_seq = 2 TTL = 64時間= 0.408秒
192.168.30.52から64バイト:icmp_seq = 3 TTL = 64時間= 0.400秒192.168.30.52から
64バイト= 4 TTL = 64時間icmp_seq = 0.392 MS 192.168.30.52から
64バイト:icmp_seq = 5 TTL = 64時間= 0.393秒

--- 192.168.30.52 ping statistics ---
5パケット送信、5受信、0%パケット損失、時間3996ms
rttmin/avg/max /この結果は

ある

#include <stdio.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <sys/types.h> 

#define FILE_NAME "ping.txt" 
#define doSystem system 

void main(void) { 
    FILE *fp; 
    char cmdBuf[256], fileBuf[256], buffer[256]; 
    char dst_addr[124] = "192.168.30.52"; 
    struct in_addr ipaddr; 

    ssize_t read; 
    size_t len = 0; 

    if(!inet_aton(dst_addr, &ipaddr)) { 
     printf("invalid ip address\n"); 
    } else { 
     sprintf(cmdBuf, "ping -c5 -W1 %s > %s", dst_addr, FILE_NAME); 
     fp = fopen(FILE_NAME, "a+"); 
     fprintf(fp , "ping -c5 -W1 %s\n", dst_addr); 
     doSystem(cmdBuf); 

     fp = fopen(FILE_NAME, "r"); 
     while(fgets(buffer, 255, (FILE*) fp)) { 
      printf("%s", buffer); 
     } 
    } 
} 

コマンドラインは、ファイルの終わりを書いている... MDEV = 0.368/0.392/0.408/0.018ミリ



が、このソース結果は..ですPING 192.168.30.52(192.168.30.52)56(84)バイトのデータ。 192.168.30.52から
64バイト:icmp_seq = 1個のTTL = 64時間= 0.368秒192.168.30.52から
64バイト:icmp_seq = 2 TTL = 64時間= 0.408秒
192.168.30.52から64バイト:icmp_seq = 3 TTL = 64時間= 0.400秒192.168.30.52から
64バイト= 4 TTL = 64時間icmp_seq = 0.392 MS 192.168.30.52から
64バイト:icmp_seq = 5 TTL = 64時間= 0.393秒

--- 192.168.30.52 ping statistics ---
5パケット送信、5受信、0%パケット損失、時間3996ms
rttmin/avg/max/MDEV = 0.368/0.392/0.408/0.018ミリ
ピング-C5 -W1 192.168.30.52

私はそれを修正することができますどのように?/?

+0

新しいファイルを作成し、新しい行を最初に書き込んだ後、古いファイルの残りを追加します。最後にnewをoldに変更します。それは悪い考えです。ログファイルは常に書き換えられますが、書き換えられません。 – Olaf

+1

"doSystem"を呼び出す直前にfcloseを追加してみてください。 – Jay

+0

一時ファイルを作成し、そのファイルにすべての最新のping結果を書き込み、古いファイルデータを一時ファイルに追加して古いファイルを削除し、一時ファイル名を古いファイル名に変更します。 –

答えて

0
sprintf(cmdBuf, "ping -c5 -W1 %s >> %s", dst_addr, FILE_NAME); 
fp = fopen(FILE_NAME, "w"); 
fprintf(fp , "ping -c5 -W1 %s\n", dst_addr); 
fclose(fp); 
doSystem(cmdBuf); 

このようになります。

すべてのコメントのおかげで!

+1

将来の読者のために、前に何が起こったのですか?ファイルを閉じるのを忘れたときに、最初の行がバッファされ、 '>'が最初に書き、プログラム最後に*最初の行が最後にフラッシュされました。今度は、 "w"モードで正しく開いて、最終的な前の内容を消去し、ファイルを閉じて、ファイルの最後に( '' 'で)正しく追加します。 –

+0

無関係: 'void main()'は何十年にもわたって非難されています( 'int main'で環境に値を返さなければなりません)、あなたが開いているストリームを常に閉じるのが実用的です... –

0

ファイルへの出力は完全にバッファされます。コマンドを実行する前にバッファをフラッシュする必要があります。 sprintfの中

sprintf(cmdBuf, "ping -c5 -W1 %s > %s", dst_addr, FILE_NAME); 
    fp = fopen(FILE_NAME, "a+"); 
    fprintf(fp , "ping -c5 -W1 %s\n", dst_addr); 
    fflush(fp); 
    doSystem(cmdBuf); 
+0

ありがとうございました! !!! – kara

-1

、>( "W" モードと同じ)ファイルの内容を置き換えます。 >>の使用は "a"モードと同じです。

#include <stdio.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <sys/types.h> 

#define FILE_NAME "ping.txt" 
#define doSystem system 

void main(void) 
{ 
     FILE *fp; 
     char cmdBuf[256], fileBuf[256], buffer[256]; 
     char dst_addr[124] = "192.168.0.6"; 
     struct in_addr ipaddr; 

     ssize_t read; 
     size_t len = 0; 

     if(!inet_aton(dst_addr, &ipaddr)) 
     { 
       printf("invalid ip address\n"); 
     } 
     else 
     { 
      sprintf(cmdBuf, "ping -c5 -W1 %s >> %s", dst_addr, FILE_NAME); 
       fp = fopen(FILE_NAME, "a+"); 
       fprintf(fp , "ping -c5 -W1 %s\n", dst_addr); 
       fclose(fp); 
       doSystem(cmdBuf); 
     }  
} 
関連する問題