2011-07-13 191 views
0

我在Windows上有一個文件。我用C++編寫。我有一個問題,我需要從文件末尾刪除一些字節。我正在使用ifstream,但我不知道如何刪除這些字符,簡單地把'\ 0'放在文件中或什麼?更改二進制文件

+2

'iofstream'?你確定? –

回答

2

Linux機器上,使用截斷(): http://linux.die.net/man/2/truncate

在Windows機器上,使用SetEndOfFile():

http://msdn.microsoft.com/en-us/library/aa365531%28v=vs.85%29.aspx

兩者都依賴於操作系統的調用。

+0

對窗口使用SetEndOfFile。我需要找到我想要結束的地方,然後使用該方法?如果我再次打開它並轉到EOF,它將成爲新的尺寸? –

+0

更新...查看鏈接。它寫道,你需要尋找你想要你的'EOF'的地方。 –

2

爲什麼不截斷文件?看看chsize()方法。

+0

我沒有在ifstream –

+0

的API中看到它不是iostream的一部分,它是一個與文件調用的獨立方法 - 它將調整文件的大小(並因此刪除尾部字節 - 這可能是您想要的嗎? ) – Nim

+0

使用chsize for windows。如果我再次打開它並轉到EOF,它將成爲新的尺寸? –

2

您不能移動更改文件的大小;唯一的方法是將文件複製到臨時文件,然後刪除原始文件並重命名臨時文件。

如果僅僅是截斷文件的情況,Windows和Unix(但不一定是其他系統)都有系統級功能可以做到這一點,但標準中沒有任何支持它的東西。如果最終不得不刪除最後的字節,Windows和Unix都不允許它(儘管其他一些系統至少在特定情況下)。

+0

我只需要做到最後,而不是在中間或開始。我的問題是,如果我在Windows中使用它,操作系統的所有其他內部參數是否會更新? –

+0

如果你願意使用boost,1.46支持現在應該允許一定程度的可移植性的'resize()'方法 - 爲什麼它從一開始就不被包含是一個謎... – Nim

+0

@Roman如果你使用系統相關功能,它將執行系統指定的功能。如果系統規範聲明它截斷了該文件,那麼它會截斷該文件(或者系統中存在缺陷)。 –