2011-07-13 245 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如果你使用系统相关功能,它将执行系统指定的功能。如果系统规范声明它截断了该文件,那么它会截断该文件(或者系统中存在缺陷)。 –