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

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

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

...
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数组时,这似乎并不正确。

请原谅我的无礼,我对文件读写和文件映射完全陌生。我似乎无法在网上找到的文档中找到我做错的事情。

谢谢!

tangnande 回答:创建一个新文件写入C并将其初始化为空?

这行不是您想要的:

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

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

您可能想要

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

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

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

,但是除非使用sizeof(towrite)-1,否则终止空字节也将被写入。

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

本文链接:https://www.f2er.com/2539854.html

大家都在问