gpt4 book ai didi

c - Unix: write() when offset is greater than size

转载 作者:太空宇宙 更新时间:2023-11-03 23:27:19 24 4
gpt4 key购买 nike

我有以下代码:

 #include <ctype.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>

char buf[]="wimpykid";
char buff[100];
void pri(int fd);
int main(){
int i=0,fd;
fd=creat("ifile", S_IRUSR|S_IWUSR); pri(fd);
write(fd, buf, 8); pri(fd);

lseek(fd, 23, SEEK_CUR); pri(fd);
while(buf[i]!='\0'){
if(i%2)
buf[i]=toupper(buf[i]);i++;
}
write(fd, buf,8); pri(fd);
exit(0);
}
//print the current offset
void pri(int fd){
printf("%d\n", lseek( fd, 0, SEEK_CUR));
}

输出为 0,8,31,39。第一次写入后,偏移量现在为 8。文件中只有 8 个字符,但如何将 23 添加到当前偏移量?如果我这样做了,当我向它写入另外 8 个字符时,这 8 个字符将从哪里开始?输出显示后 8 个字符直接跟在前 8 个字符之后。不太明白。

最佳答案

当您查看(可打印的部分)文件内容时,它可能看起来像是直接写入的两个字符序列彼此跟随:

$ cat ifile
wimpykidwImPyKiD

那是因为这里不显示不可打印的字符。当您查看二进制数据时,您也可以看到它们:

$ hexdump -C ifile
00000000 77 69 6d 70 79 6b 69 64 00 00 00 00 00 00 00 00 |wimpykid........|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 77 |...............w|
00000020 49 6d 50 79 4b 69 44 |ImPyKiD|
00000027

如您所见,两个字符串之间有许多零字节。这些零字节从何而来?查看 lseek 函数的手册页:

The lseek() function allows the file offset to be set beyond the end of the file (but this does not change the size of the file). If data is later written at this point, subsequent reads of the data in the gap (a "hole") return null bytes ('\0') until data is actually written into the gap.

此类文件可能会被文件系统实现为稀疏文件。

供引用:

关于c - Unix: write() when offset is greater than size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23488163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com