linux写字符串到文件,关于linux:我想写字符串到文件的顶部。 但它不起作用。(在c中)...

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

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值