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

i want write string to top of the file . but it dosen't work.(in 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

但是这个源结果是...命令行写的是文件的结尾..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include
#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
"
);
    } 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

我该怎么办呢?/?


输出到文件是完全缓冲的。 在执行命令之前,需要刷新缓冲区。

1
2
3
4
5
6
    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);


1
2
3
4
5
6
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);

我喜欢这样。

有用 !

感谢所有评论!


在sprintf中,>替换文件内容(与"w"模式相同)。 使用>>与"a"模式相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include
#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
"
);
        }
        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);
        }    
}