在 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
.
打开
我想打开一个新文件并向其中写入一个字符数组,但是当我读回文件的内容时,它有我写入的内容,后面跟着一堆垃圾字符。
我想将文件映射到内存,但是当我从该映射读回文件时,我得到了它后面的那些随机字符。
...
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
.