【问题标题】:How to delete the last data in a file with linux system calls in C?如何使用 C 中的 linux 系统调用删除文件中的最后一个数据?
【发布时间】:2015-03-28 22:26:21
【问题描述】:

该文件仅包含相同类型的结构 (mydata)。

我试过了:

int counter,file;
file = open(filename, O_RDWR, S_IRUSR | S_IWUSR);
// some error handling

// let's go to the end of the file
while(read(file,&mydata,sizeof(mydata))>0) counter++;
// let's go one step back
lseek(file,-sizeof(mydata),SEEK_CUR);
// delete the last data
write(file,NULL,sizeof(obs)); // it's not working :(

close(file);

我必须使用 linux 系统调用 (http://codewiki.wikidot.com/system-calls),因为这是目标。

我尝试了很多方法,但我找不到一个可行的解决方案:

将除最后一个 mydata 之外的所有内容写入临时文件中,并使用 O_TRUNC oflag 重新打开原始文件并将内容写回。

您能告诉我什么是正确的解决方案吗?

【问题讨论】:

  • 你真的应该使用stat()lstat() 而不是像那样计算文件中的字节数......
  • 次要:如果不覆盖原始计划,默认计划会更好。而是创建第二个文件。成功后,删除原件。这允许在步骤失败时提供更多恢复路径。

标签: c linux file-io system-calls


【解决方案1】:

对于 linux,特别是 ftruncate() 需要文件描述符和 truncate() 需要文件路径。您需要做的就是确定您的文件应该有多少字节,然后调用其中一个。

我建议您首先确保文件大小是您所需数据大小的倍数,以确保它可以被截断并且最后仍然包含完整的数据项。

您可能还需要考虑如何处理极端情况,即初始文件大小小于一个数据项的大小、零或不是数据项长度大小的倍数(以字节为单位)。

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    相关资源
    最近更新 更多