我想写'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);
}
}