写入文件(fprintf)

时间:2011-06-08 13:27:14

标签: c file-io printf

我试图在Linux中添加一些绑定到ARP表,在C.我用“a”打开一个文件(追加,对吗?)然后尝试写一些地址,但我总是得到分段错误。我认为ARP_table[i].IPaddr, ARP_table[i].MACaddr, ARP_table[i].ARPstatus

有问题
struct ARP_entry 
{
  char IPaddr[16];
  char MACaddr[18];
  char ARPstatus;
  int timec;
};

static struct ARP_entry ARP_table[ARP_table_vel];

void copyZIS()
{
  int i=0;
  const char filename[] = "/proc/net/arp";
  FILE *file = fopen(filename, "a");


  for (i; i< i+j; i++)
  {
     fprintf(file, "%c %c %c", ARP_table[i].IPaddr, ARP_table[i].MACaddr, ARP_table[i].ARPstatus);
  }

}

4 个答案:

答案 0 :(得分:2)

您没有检查fopen的返回值。我非常确定您不能写入该文件

FILE *file = fopen(filename, "a");
if (NULL == file) {
    perror("fopen");
    /* return / exit */
}

这是我系统上的/proc/net/arp

[cnicutar@aiur ~]$ ls -l /proc/net/arp
-r--r--r-- 1 root root 0 Jun  8 16:29 /proc/net/arp

答案 1 :(得分:1)

一方面,i<i+j永远都是真的,只要j(你没有显示)是正面的。

然后,您尝试使用%c显示字符串,该字符串应为%s

至于细分错误,您的ARP_table很可能是0或垃圾,但由于您实际上并没有显示它是如何创建的,所以祝你好运。

顺便说一句,我觉得我需要指出这是一些看起来很糟糕的代码。基本问题,如“这些变量是什么?”永远不应该询问您是否具有完整的功能代码和类型定义。它们不应该是全局变量,而应该作为参数传递给更好地处理它们的函数。

答案 2 :(得分:0)

j在哪里?

如果j是一个严格的正常数,你将遇到一个无限循环,
因为i总是小于i + [someting positive]。这可能会导致错误,因为您的数组只有有限数量的元素。

如果j是可变的并且变为负数,则不会遇到无限循环,但是会产生比i中元素数量大ARP_table的{​​{1}}。< / p>

答案 3 :(得分:0)

  1. 你不能写入/ proc / net / arp,它只能用于阅读。 (并且更改arp表非常简单,最好使用适当的参数运行外部iparp命令。
  2. 检查fopen的返回值,可能会失败。
  3. ARP_table和j定义在哪里?也许那里出了点问题。
  4. 条件i > i+j看起来很奇怪,你确定这是正确的条件,你不应该只在i < j时停止吗?
  5. ARP_table [i] .IPaddr是否包含合理的内容?
  6. "%c %c %c"会出错。 %c打印单个字符。听起来两个首先应该是字符串,所以使用“%s%s%c”