C - 创建和写入文件时的奇怪字符

时间:2014-07-02 22:07:43

标签: c system-calls dot

这是我的小C程序:

int main(int ac, char **av)
{
  int   fd;

  if ((fd = open("./test.dot", O_RDWR | O_CREAT | O_TRUNC, 0644)) == -1)
  {
    perror("[open]");
    return (-1);
  }
  write(fd, "digraph g {\n", sizeof("digraph g {\n"));
  write(fd, " a -> b -> c\n", sizeof(" a -> b -> c\n"));
  write(fd, " b -> d\n", sizeof(" b -> d\n"));
  write(fd, " }\n", sizeof(" }\n"));
  close(fd);
}

它打开一个文件,写一些东西并关闭它。

它几乎可以工作。几乎。这是我检查文件内容时得到的结果:

digraph g {
^@ a -> b -> c
^@ b -> d
^@ }
^@

似乎这些字符出现在每个换行符之后。怎么了?

3 个答案:

答案 0 :(得分:4)

sizeof("digraph g {\n")包含null终止符,因此字符串将以'\0'字符写入文件中。

您的文件查看器使用^@有向图显示零。

您根本不应该使用sizeof - 而是使用strlen。更好的是,使用适当的I / O函数将字符串写入文件,而无需在单独的参数中提供它们的长度。如果您必须使用write,请创建自己的函数,调用strlen,然后调用write,这样就可以避免键入字符串常量两次。

答案 1 :(得分:1)

^@是您的观看者对'\0'的表示。

示例:sizeof(" }\n")为4. ' ''}''\n''\0'

答案 2 :(得分:1)

我认为您应该使用sizeof("string")而不是strlen("string")