在 C 中创建一个要写入的新文件并将其初始化为空?

Create a new file to write to in C and initialize it as empty?

我想打开一个新文件并向其中写入一个字符数组,但是当我读回文件的内容时,它有我写入的内容,后面跟着一堆垃圾字符。

我想将文件映射到内存,但是当我从该映射读回文件时,我得到了它后面的那些随机字符。

...
char *towrite = "12345"

int fd = open("file.txt",  O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);

struct stat sb;

write(fd, &towrite, sizeof(towrite));

if(fstat(fd, &sb) != -1){
     printf("file is %ld bytes long.\n", sb.st_size);
}

char *mappedfile = mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

for(int z=0; z < sb.st_size; z++){
     printf("%c", mappedfile[z]);
}
printf("\n");
close(fd);
...

我还注意到文件大小返回为 1790 字节,当我只写一个如此小的 char 数组时,这看起来确实不正确。

原谅我的无礼,我对文件读写和文件映射都是新手。我似乎无法通过我在网上找到的文档找到我做错了什么。

谢谢!

这行不是你想要的:

write(fd, &towrite, sizeof(towrite));

这会将指针 towrite 的值写入文件,而不是它指向的字符串。此外,对于指针,sizeof是指针的大小,而不是它所指向的大小。

你可能想要

write(fd, towrite, strlen(towrite));

您也可以将 towrite 更改为数组并执行

char towrite[] = "12345";
write(fd, towrite, sizeof(towrite));

但是终止空字节也会被写入,除非你使用 sizeof(towrite)-1 代替。

此外,您在打开时没有使用标志 O_TRUNC,因此文件不会被截断:如果文件已经存在,文件中超过您正在写入的 5 个字节的任何数据都将保留那里。您的 1790 字节可能是之前测试遗留下来的。如果您想删除以前的内容并从一个空文件重新开始,请使用标志 O_RDWR | O_CREAT | O_TRUNC.

打开