我想寫'ping'的結果。
首先,我編寫指令行,然後..編寫其餘的ping結果。
像這樣。
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 time = 0.368 ms
來自192.168.30.52的64位元組:icmp_seq = 2 ttl = 64時間= 0.408 ms
來自192.168.30.52的64位元組:icmp_seq = 3 ttl = 64時間= 0.400毫秒
來自192.168.30.52的64位元組:icmp_seq = 4 ttl = 64時間= 0.392 ms
來自192.168.30.52的64位元組:icmp_seq = 5 ttl = 64時間= 0.393毫秒
--- 192.168.30.52 ping統計---
傳輸5個包,5個接收,0%丢包,時間3996ms
rtt min / avg / max / mdev = 0.368 / 0.392 / 0.408 / 0.018 ms
但是這個源結果是...指令行寫的是檔案的結尾..
#include
#include
#include
#include
#include
#include
#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
");
} else {
sprintf(cmdBuf,"ping -c5 -W1 %s > %s", dst_addr, FILE_NAME );
fp = fopen(FILE_NAME,"a+");
fprintf(fp ,"ping -c5 -W1 %s
", 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)位元組的資料。
來自192.168.30.52的64位元組:icmp_seq = 1 ttl = 64 time = 0.368 ms
來自192.168.30.52的64位元組:icmp_seq = 2 ttl = 64時間= 0.408 ms
來自192.168.30.52的64位元組:icmp_seq = 3 ttl = 64時間= 0.400毫秒
來自192.168.30.52的64位元組:icmp_seq = 4 ttl = 64時間= 0.392 ms
來自192.168.30.52的64位元組:icmp_seq = 5 ttl = 64時間= 0.393毫秒
--- 192.168.30.52 ping統計---
傳輸5個包,5個接收,0%丢包,時間3996ms
rtt min / avg / max / mdev = 0.368 / 0.392 / 0.408 / 0.018 ms
ping -c5 -W1 192.168.30.52
我該怎麼辦呢?/?
通過建立新檔案,首先編寫新行,然後附加舊檔案的其餘部分。 最後重新命名為old。 說:這是個壞主意; 始終附加日志檔案,而不是重寫。
嘗試在調用"doSystem"之前添加fclose。
建立臨時檔案并将所有最新的ping結果寫入該檔案,然後将舊檔案資料附加到臨時檔案,然後删除舊檔案并将臨時檔案名重命名為舊檔案名。
我剛剛在"doSystem"之前嘗試過fclose。 但是不要工作。!
在cmdBuf中建立的指令中嘗試">>"而不是">"
有用! 謝謝 !
@Olaf,Ankur你甚至讀過這個問題? 标題有點誤導,但閱讀問題澄清了其他明智之處。
為什麼這個問題被擱置?! T_T對此有什麼不妥...... ?? .....
輸出到檔案是完全緩沖的。 在執行指令之前,需要重新整理緩沖區。
sprintf(cmdBuf,"ping -c5 -W1 %s > %s", dst_addr, FILE_NAME );
fp = fopen(FILE_NAME,"a+");
fprintf(fp ,"ping -c5 -W1 %s
", dst_addr);
fflush(fp);
doSystem(cmdBuf);
謝謝您的回答 !!!!
sprintf(cmdBuf,"ping -c5 -W1 %s >> %s", dst_addr, FILE_NAME );
fp = fopen(FILE_NAME,"w");
fprintf(fp ,"ping -c5 -W1 %s
", dst_addr);
fclose(fp);
doSystem(cmdBuf);
我喜歡這樣。
有用 !
感謝所有評論!
對于未來的讀者,之前發生的事情:當你忘記關閉檔案時,第一行被緩沖,>在開頭寫,而在程式結束時,第一行最後被重新整理。 現在,您使用"w"模式正确打開以删除最終的先前内容,關閉檔案并在檔案末尾正确追加(使用>>)。
不相關:void main()已被棄用了幾十年(應該是int main并且應該傳回環境值),并且總是關閉你打開的流是很好的...
在sprintf中,>替換檔案内容(與"w"模式相同)。 使用>>與"a"模式相同。
#include
#include
#include
#include
#include
#include
#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
");
}
else
{
sprintf(cmdBuf,"ping -c5 -W1 %s >> %s", dst_addr, FILE_NAME );
fp = fopen(FILE_NAME,"a+");
fprintf(fp ,"ping -c5 -W1 %s
", dst_addr);
fclose(fp);
doSystem(cmdBuf);
}
}