2012-02-05 41 views
2

我嘗試更新文件的某些部分,而不刪除或覆蓋其他任何內容,但Lua的讀/寫模式似乎只支持追加數據或刪除現有數據並編寫新的數據。這裏有一個例子:Lua:更新文件十六進制編輯器樣式的部分

testfile.pak:「這是外面冷」 - >「這是溫暖外」

現在,我處理相當大的文件,而不是文本的文件,所以閱讀他們進入內存和只使用字符串操作函數在這裏沒有選擇。另外,我已經將這些文件作爲程序的一部分處理,所以我不想通過重新讀取它們到必要的位置來增加開銷,插入數據並寫下其餘部分。這需要兩倍的硬盤空間和兩倍的時間。我也不能在第一個處理週期中寫入必要的數據。所以我想知道是否有可能告訴Lua寫入文件中的某個偏移量而不必創建臨時文件或重複文件,有點像十六進制編輯器能夠更改文件的特定部分,而無需創建保存文件的全新副本。是否有其他 - 可能沒有記錄 - 爲io.open寫入除「w」,「w +」,「a」和「a +」之外的選項?

回答

6

你可以用 「R +」 模式下做到這一點:

~$ cat > test.dat 
It's cold outside. 
~$ lua 
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio 
> f = io.open('test.dat', 'r+') 
> f:seek("set", 5) 
> f:write("warm") 
> f:close() 
> 
~$ cat test.dat 
It's warm outside. 
~$ 
+0

非常感謝。這很好用!我不知道我仍然可以用「r +」模式打開文件來寫入文件。另外,使用seek命令指定寫入位置非常聰明。我有點認爲它只用於閱讀功能。 – Zerobinary99 2012-02-05 16:18:59

+0

是的,令人困惑的「r +」被稱爲「更新」模式(它允許你閱讀那裏的內容,但也可以在任何地方寫)。爲什麼他們不使用「你」或別的東西,我不知道。 – 2012-02-05 17:00:33