2011-05-17 116 views
1

我有以下情况。我有一个大文件,说1 KB。我想读取前100个字节,然后从文件中删除100个字节的读取数据,然后读取下100个字节。要读取100个字节是可以的,但是如何从文件中删除100个字节?如何在Visual C++中截断文件?

+3

1kb不是一个大文件。它实际上是一个非常小的文件。除非您处于内存非常有限的嵌入式场景中,否则您为何不读取整个文件? – 2011-05-17 11:35:03

回答

4

这通常做一个多步骤的过程:

  1. 重命名原始文件。
  2. 将你想要的数据写入一个带有原始文件名的新文件。
  3. 使用包含不再需要的数据的临时名称删除旧文件。

这样,如果出现问题,您可以简单地恢复您重命名的原始文件。将文件从一个地方移动到另一个地方也是这样实施的。


但是,如果您不想这样做,则SetEndOfFile function是另一个可行的选项,可以在原地截断文件的内容。从文档:

为指定的文件到文件指针的当前位置的物理文件的大小。

物理文件大小也被称为文件的结尾。 SetEndOfFile函数可用于截断或扩展文件。

+0

我的理解是OP想要删除文件开头的数据。 “SetEndOfFile”函数可能会删除尚未读取的数据。 – 2011-05-17 16:52:40

+0

@Thomas:这是可能的。我认为自从我上次查找它之后,“truncate”这个词的定义仍然是一样的。无论哪种情况,我的答案的第一部分都适用。第二种方法对于那些可能想要重新设计其逻辑以在文件末尾执行更正常的截断数据的人很有用。 – 2011-05-17 23:22:02

+0

只有当没有其他线程正在写入文件或使用它时,您才可以完成这3个步骤。 – 2011-07-14 09:06:00

3

那不会被称为截断;该术语是指从最终而不是开始移除数据。我不知道任何可能的操作系统,除了从第100个字节开始将文件内容复制到新文件之外。

+2

另请参阅http://blogs.msdn.com/b/oldnewthing/archive/2010/12/01/10097859.aspx,其中详细解释了为什么没有实施。 – MSalters 2011-05-17 15:18:10

1

删除已在文件中处理的数据非常耗时,并且在大多数情况下不是必需的。

删除文件顶部或中间附近的数据需要编写一个新文件,这需要时间和磁盘空间。大多数应用程序将读取并处理整个文件,然后重命名文件(使用备份扩展名)。这对调试有用。删除整个文件通常是一个更快的操作,即在不处理数据的情况下编写新文件。

删除只能在必要时进行。对于文件,可以存储有效数据开始位置的偏移量,从而减少了从文件中删除数据的需求。出于安全目的,覆盖文件中的数据通常会更快,然后创建一个没有处理数据的新文件。

首先尝试编写程序以不删除文件中的数据。只有在程序健全并正常工作后,才能根据需要删除。许多人建议只在没有更多空间的情况下删除文件。