2017-03-09 35 views
-3

我想寫'結果'的結果。我想要寫入字符串頂部的文件。但它不工作(在c)

首先,我寫命令行,然後...寫其餘的ping結果。

這樣子。

平-C5 -W1 192.168.30.52
PING 192.168.30.52(192.168.30.52)56(84)個數據字節。
64字節從192.168.30.52: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個字節:icmp_seq = 4 TTL = 64時間= 0.392毫秒從192.168.30.52
64字節:icmp_seq = 5 TTL = 64時間= 0.393毫秒

--- 192.168.30.52 ping statistics ---
發送5個數據包,發送5個數據包,發送0%數據包丟失數據,時間3996ms
rtt min/avg/max/MDEV = 0.368/0.392/0.408/0.018毫秒



但這源結果是...命令行寫的文件的末尾..

#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); 
     } 
    } 
} 

這個結果是

PING 192.168.30.52(192.168.30.52)56(84)字節的數據。
64字節從192.168.30.52: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個字節:icmp_seq = 4 TTL = 64時間= 0.392毫秒從192.168.30.52
64字節:icmp_seq = 5 TTL = 64時間= 0.393毫秒

--- 192.168.30.52 ping statistics ---
發送5個數據包,發送5個數據包,發送0%數據包丟失數據,時間3996ms
rtt min/avg/max/MDEV = 0.368/0.392/0.408/0.018毫秒
平-C5 -W1 192.168.30.52

如何解決它??? /?

+0

通過創建一個新文件,首先寫入新行,然後附加其餘的舊文件。最後重新命名爲舊的。說:這是一個壞主意;日誌文件總是附加的,而不是重寫。 – 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

對於未來的讀者,以前發生過什麼:當你忘記關閉文件時,第一行被緩衝,'''在開頭寫入,在程序中最後,* first *行終於被刷新了。現在,您可以用「w」模式正確打開以擦除最終的前一個內容,關閉文件並在文件末尾正確追加(使用「>>」)。 –

+0

無關:'void main()'被棄用了幾十年(應該是'int main'並且應該返回環境值),並且總是關閉所打開的流... –

0

輸出到文件被完全緩衝。在執行命令之前,需要刷新緩衝區。

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

in sprintf,>替換文件內容(與「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); 
     }  
} 
相關問題