为什么从字符串写入文件时会得到额外的字符?

Why am I getting extra characters when writing to a file from a string?

我的程序用 open, writes a string to the file using write 打开文件描述符,然后关闭文件描述符。当我检查文件内容时,它在字符串后有附加字符。 Visual Studio 代码将这些显示为“␀”(带有字母“NUL”的单个代码点);下面的屏幕截图准确地显示了它们在 VS Code 中的显示方式。为什么文件中有这些额外的字符?

// test.cpp

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> 
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>

int main(){
    int fd = open("out.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
    char buff[BUFSIZ];
    bzero(buff, sizeof(buff));
    strcpy(buff, "This is a test message!\n");
    write(fd, buff, sizeof(buff));
    close(fd);
}

试试这个并按如下方式更改您的代码。

//bzero call is useless
write(fd, buff, strlen(buff));

问题是您必须将确切的字节数写入文件,因此您必须使用 strlen 函数,它计算字符串中的字符直到第一个 \0,在本例中它是自动放置的在编译器的 \n 之后(参见 this)。

write(fd, buff, sizeof(buff)); 至少写出 256 个字节,因为这是 char buff[BUFSIZ]; 的大小,BUFSIZ(来自 <stdio.h>)至少为 256。

除了"This is a test message!\n"之外,还写了数百个空字符。对于 OP,它们显示为“一些额外的东西”。 @某程序员哥们

如果只要"This is a test message!\n",就不要写几百个字节,只写字符串的长度

// write(fd, buff, sizeof(buff));
write(fd, buff, strlen(buff));