File 如何在使用r+打开文件时删除文件内容;模式

File 如何在使用r+打开文件时删除文件内容;模式,file,file-io,lua,file-manipulation,File,File Io,Lua,File Manipulation,我已使用r+模式打开了文件。我对它做了一些修改,我想删除从X开始到文件末尾的内容 不幸的是,我不知道该怎么做。我一直在浏览文档,但没有提到这一点 我不想将:space:写入文件,使其“看起来”像已清除,我还想将其缩小 在这种情况下,使用w打开文件不是一个选项。使用r+模式打开文件会保留当前内容;因此,我认为没有办法使用Lua中可用的函数截断文件的其余部分。这表明可以使用重新打开和w+来完成,但由于您表示无法打开它进行写入,我认为没有办法实现您想要的 在此脚本上进行测试将生成新内容ext(其中ex

我已使用
r+
模式打开了文件。我对它做了一些修改,我想删除从X开始到文件末尾的内容

不幸的是,我不知道该怎么做。我一直在浏览文档,但没有提到这一点

我不想将
:space:
写入文件,使其“看起来”像已清除,我还想将其缩小


在这种情况下,使用
w
打开文件不是一个选项。

使用
r+
模式打开文件会保留当前内容;因此,我认为没有办法使用Lua中可用的函数截断文件的其余部分。这表明可以使用
重新打开
w+
来完成,但由于您表示无法打开它进行写入,我认为没有办法实现您想要的

在此脚本上进行测试将生成
新内容ext
(其中
ext
是早期内容的剩余内容):


根据我的经验,我发现在Lua中截断文件的唯一方法是以
“w+”
模式将内容写入辅助文件,然后重命名辅助文件以覆盖原始文件。当然,根据文件的大小,您可能希望节省使用此方法

在本例中,
“path”
是指向原始文件的路径

local file, err = io.open( path + ".tmp", "w+" )
if not file then return end

file:write( truncated_data )
file:close( )

assert( os.rename( path + ".tmp", path ) )

你能提供一个真实的例子吗?恐怕我不明白你的问题。@ColonelThirtyTwo,
r+
打开文件进行读写。Standart C没有提供这种功能。卢阿也是。您可以创建新文件、重写旧文件或使用某些外部io库。可能是
seek
调用position?您可以这样做,但它不会删除现有内容,这正是OP想要做的。感谢Paul提供的示例。这正是我面临的问题
seek
仅更改carret的当前位置,但如何从中删除数据?我对一个循环很满意,我只是不知道在那里写什么。@Krystian,不幸的是,考虑到您的限制,我看不到一种方法来完成它。您可以尝试使用,其中包括
truncate
ftruncate
,但它需要LuaJIT/FFI或Lua/luaffi。
local file, err = io.open( path + ".tmp", "w+" )
if not file then return end

file:write( truncated_data )
file:close( )

assert( os.rename( path + ".tmp", path ) )