1

lseek只是用来查找文件的大小并lseek返回比文件的实际大小更少的字节。我认为代码是正确的,我无法解释为什么会发生这种情况。

当我第一次运行该程序时,它运行良好。然后我在文件中添加了一些数据,所以它改变了它的大小。从那以后,当我用新文件再次运行程序时,结果总是旧文件的大小。

任何帮助表示赞赏!

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);
}
4

1 回答 1

1

首先,让我们更改这些行

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);

现在到你的问题。对文件的修改可能不会立即可见(由于内核的缓存/缓冲)。修改文件后,运行命令sync或在代码中调用函数fsync()fdatasync().

于 2021-06-05T13:49:40.363 回答