【问题标题】:i want write string to top of the file . but it dosen't work.(in c) [closed]我想将字符串写入文件顶部。但它不起作用。(在c中)[关闭]
【发布时间】:2017-03-09 06:59:48
【问题描述】:

我想写“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 time=0.408 ms
来自 192.168.30.52 的 64 个字节:icmp_seq=3 ttl=64 time=0.400 ms
来自 192.168.30.52 的 64 个字节:icmp_seq=4 ttl=64 time=0.392 ms
来自 192.168.30.52 的 64 个字节:icmp_seq=5 ttl=64 time=0.393 ms

--- 192.168.30.52 ping 统计 ---
发送 5 个数据包,接收 5 个数据包,0% 数据包丢失,时间 3996 毫秒
rtt min/avg/max/mdev = 0.368/0.392/0.408/0.018 ms



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

#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) 个字节的数据。
来自 192.168.30.52 的 64 个字节:icmp_seq=1 ttl=64 time=0.368 ms
来自 192.168.30.52 的 64 个字节:icmp_seq=2 ttl=64 time=0.408 ms
来自 192.168.30.52 的 64 个字节:icmp_seq=3 ttl=64 time=0.400 ms
来自 192.168.30.52 的 64 个字节:icmp_seq=4 ttl=64 time=0.392 ms
来自 192.168.30.52 的 64 个字节:icmp_seq=5 ttl=64 time=0.393 ms

--- 192.168.30.52 ping 统计 ---
发送 5 个数据包,接收 5 个数据包,0% 数据包丢失,时间 3996 毫秒
rtt min/avg/max/mdev = 0.368/0.392/0.408/0.018 ms
ping -c5 -W1 192.168.30.52

我该如何解决???/?

【问题讨论】:

  • 通过创建一个新文件,首先写入新行,然后附加旧文件的其余部分。最后将新命名为旧。说:这是个坏主意;日志文件总是被附加,而不是重写。
  • 尝试在调用“doSystem”之前添加一个 fclose。
  • 创建一个临时文件并将所有最新的ping结果写入该文件,然后将旧文件数据附加到临时文件,然后删除旧文件并将临时文件名重命名为旧文件名..
  • 我刚刚尝试在“doSystem”之前关闭。但不工作。!
  • 在您在 cmdBuf 中创建的命令中尝试“>>”而不是 ">"

标签: c linux printf fopen ping


【解决方案1】:
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);

我喜欢这样。

它有效!

感谢所有cmets!

【讨论】:

  • 对于未来的读者来说,之前发生的事情:因为你忘记关闭文件,第一行被缓冲,&gt; 在开头写,在程序结束时,first 行终于被刷新了。现在,您可以正确地以“w”模式打开以删除最终的先前内容,关闭文件并在文件末尾正确附加(&gt;&gt;)。
  • 不相关:void main() 已弃用数十年(应为 int main 并应将值返回给环境),最好始终关闭您打开的流...
【解决方案2】:

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

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

【讨论】:

  • 谢谢你的回答!!!!
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多