写入文件

时间:2011-06-26 06:55:48

标签: c linux file

我有一个关于文件写的非常简单的问题。

我有这个程序:

char buf[20];
size_t nbytes;

strcpy(buf, "All that glitters is not gold\n");
fd= open("test_file.txt",O_WRONLY);
write(fd,buf,strlen(buf));
close(fd);

当我在运行此程序后打开文件test_file.txt时,我感到困惑的是,在“所有闪闪发光的不是”之后我看到一些像^C^@^@^@^^^@这样的字符:请注意,部分buf不是写的,而这些字符出现。为什么会这样?

3 个答案:

答案 0 :(得分:6)

你在那个缓冲区写了超过19个字符。完成后,程序的行为是不确定的。它可以做任何想做的事。

分配足够大的缓冲区。如果您需要能够将其视为C字符串,则必须能够容纳所有字母和终止0

答案 1 :(得分:5)

字符串"All that glitters is not gold\n"超过20个字符。我建议你尝试使用更大的缓冲区。

实际上,如果你要在C中做任何重要的工作,我建议你永远不要使用strcpy作为一般习惯。使用像strncpy这样的函数,可以让你指定一个缓冲区大小,这样就可以清楚地知道你永远不会溢出。

答案 2 :(得分:2)

libgcc strcpy手册说:

  

如果是目标字符串   strcpy()不够大(那个   是的,如果程序员是愚蠢的   或懒惰,未能检查大小   在复制之前)然后任何可能   发生。溢出固定长度   字符串是最喜欢的饼干   技术

此外strlen

  

strlen()函数计算   字符串s的长度,而不是   包括终止'\ 0'   字符。

所以我猜strlen ()不会返回您期望它返回的内容,因此会写出额外的字符

为了使事情有效,你需要分配一个足够大的缓冲区,它可以容纳整个字符串。