lseek 的意外行为
Unexpected behaviour of lseek
我使用 lseek
只是为了查找文件的大小,并且 lseek
returns 比文件的实际大小少了字节数。我认为代码是正确的,我无法解释为什么会这样。
当我 运行 第一次使用该程序时,它运行良好。然后我在文件中添加了一些数据,所以它改变了它的大小。此后,当我运行程序再次用新文件时,结果总是旧文件的大小。
感谢任何帮助!
int main(int argc,char* argv[]){
int out_file_size=0;
int fd_prognameout;
fd_prognameout=open(argv[1],O_RDWR | O_CREAT,00700);
if(fd_prognameout == -1){
perror("Error:");
return(0);
}
lseek(fd_prognameout,0,SEEK_SET);
out_file_size = lseek(fd_prognameout,0,SEEK_END);
lseek(fd_prognameout,0,SEEK_SET);
printf("The size of out file is: %d\n",out_file_size);
close(fd_prognameout);
return(0);
}
首先,让我们更改这些行
lseek(fd_prognameout,0,SEEK_SET);
out_file_size = lseek(fd_prognameout,0,SEEK_END);
lseek(fd_prognameout,0,SEEK_SET);
到
//get the current file position
off_t current_pos = lseek(fd_prognameout,0,SEEK_CUR);
//get the last position (size of file)
off_t out_file_size = lseek(fd_prognameout,0,SEEK_END);
//reset to the previous position
lseek(fd_prognameout,current_pos,SEEK_SET);
现在解决你的问题。对文件的修改可能不会立即可见(由于内核 caching/buffering)。
修改文件后,运行 命令 sync
或在您的代码中调用函数 fsync()
或 fdatasync()
.
我使用 lseek
只是为了查找文件的大小,并且 lseek
returns 比文件的实际大小少了字节数。我认为代码是正确的,我无法解释为什么会这样。
当我 运行 第一次使用该程序时,它运行良好。然后我在文件中添加了一些数据,所以它改变了它的大小。此后,当我运行程序再次用新文件时,结果总是旧文件的大小。
感谢任何帮助!
int main(int argc,char* argv[]){
int out_file_size=0;
int fd_prognameout;
fd_prognameout=open(argv[1],O_RDWR | O_CREAT,00700);
if(fd_prognameout == -1){
perror("Error:");
return(0);
}
lseek(fd_prognameout,0,SEEK_SET);
out_file_size = lseek(fd_prognameout,0,SEEK_END);
lseek(fd_prognameout,0,SEEK_SET);
printf("The size of out file is: %d\n",out_file_size);
close(fd_prognameout);
return(0);
}
首先,让我们更改这些行
lseek(fd_prognameout,0,SEEK_SET);
out_file_size = lseek(fd_prognameout,0,SEEK_END);
lseek(fd_prognameout,0,SEEK_SET);
到
//get the current file position
off_t current_pos = lseek(fd_prognameout,0,SEEK_CUR);
//get the last position (size of file)
off_t out_file_size = lseek(fd_prognameout,0,SEEK_END);
//reset to the previous position
lseek(fd_prognameout,current_pos,SEEK_SET);
现在解决你的问题。对文件的修改可能不会立即可见(由于内核 caching/buffering)。
修改文件后,运行 命令 sync
或在您的代码中调用函数 fsync()
或 fdatasync()
.