c - 在 C 上使用 sprintf 和系统函数时为空文件

标签 c system asprintf

我想在文件文本中保存一些信息,我写了这个程序:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>


int main(int argc,char *argv[])
 {
     FILE *fichier;
     char buffer[20];
     char command[200];
     char command1[100];


     system(" cat /etc/resolv.conf  | grep nameserver | awk -F' ' '{print $2}' | cut -d'.' -f1-3 | awk '{print $1\".1\"}' > ethernet_dns.txt");

     fichier=fopen("ethernet_dns.txt","r");
     memset(&buffer,0,sizeof(buffer));
     fread(buffer,20,1,fichier);
     printf("buffer is: %s",buffer);

     snprintf(command,sizeof(command),"ping -c 1 -W 1  %s > /tmp/ping_result",buffer);
      printf("command is: %s",command);

     system(command);


     return 0;
 }

结果:

buffer is: 127.0.1.1
command is : ping -c 1 -W 1 127.0.1.1

系统命令返回:

    PING 127.0.1.1 (127.0.1.1) 56(84) bytes of data.
64 bytes from 127.0.1.1: icmp_seq=1 ttl=64 time=0.115 ms

--- 127.0.1.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.115/0.115/0.115/0.000 ms

但是当我运行:cat/tmp/ping_result.I 得到一个空文件

最佳答案

发布的代码有几个问题

1) 将 ping 的结果输出到 stdout 而不是 /tmp/ping_result

2) 无法从 buffer[] 数组中移除尾随换行符

下面的代码

1) 清理缩进

2) 修正代码中的问题

3) 处理调用 fopen()

的可能失败

4) 消除不需要的最终语句:return 0

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main( void )
{
     FILE *fichier;
     char buffer[20];
     char command[200];



     system(" cat /etc/resolv.conf  | grep nameserver | awk -F' ' '{print $2}' | cut -d'.' -f1-3 | awk '{print $1\".1\"}' > ethernet_dns.txt");

     fichier=fopen("ethernet_dns.txt","r");
     if( !fichier )
     {
         perror( "fopen for ethernet_dns.txt failed");
         exit( EXIT_FAILURE );
     }

     // implied else, fopen successful

     memset(buffer,0,sizeof(buffer));
     size_t len = fread(buffer,1, sizeof(buffer),fichier);
     printf( "len is: %lu\n", len );
     buffer[len-1] = '\0'; // eliminates trailing newline
     printf("buffer is: %s\n",buffer);

     snprintf(command,sizeof(command),"ping -c 1 -W 1 ");
     strcat( command, buffer);
     strcat( command, " > /tmp/ping_result");
     printf("command is: %s\n",command);

     system(command);
}

在我的电脑上,结果输出在文件中:/tmp/ping_result

PING 127.0.1.1 (127.0.1.1) 56(84) bytes of data.
64 bytes from 127.0.1.1: icmp_seq=1 ttl=64 time=0.046 ms

--- 127.0.1.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.046/0.046/0.046/0.000 ms

关于c - 在 C 上使用 sprintf 和系统函数时为空文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39978821/

相关文章:

c - 使用 valgrind 时大小为 1 的读取无效

C 递归程序无法通过 GCC 编译

c - 为什么这个程序不能无限运行?

linux - #define SYSCALL_DEFINEx(x, sname, ...)

perl - 为什么系统不返回 main 的值?

c - 从共享内存空间 c 写入和读取问题

c - 僵尸,gdb 无法附加,如何检查上次调用或回溯

sql - 如何在重负载下强制停止长 postgres 查询?

android - 如何让我的应用成为系统应用?

c - asprintf - 如何在 C 中获取字符串输入