Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在不使用其他文件的情况下剪切文件?_C++_Logging_Stl_Fstream - Fatal编程技术网

C++ 如何在不使用其他文件的情况下剪切文件?

C++ 如何在不使用其他文件的情况下剪切文件?,c++,logging,stl,fstream,C++,Logging,Stl,Fstream,是否可以删除文件的一部分(比如从开始到一半),而不必使用其他文件 谢谢你 如果您有足够的内存,请将其内容完全读取到内存中,将其复制回文件的前面,然后截断文件 如果没有足够的内存,请分块复制,并且仅在完成截断文件后进行。如果有足够的内存,请将其内容完全读取到内存中,将其复制回文件前面,然后截断文件 如果您没有足够的内存,请分块复制,并且仅在完成截断文件后进行复制。是的,这是可能的,但您仍必须重写大部分文件 大致思路如下: open the file beg = find the start of

是否可以删除文件的一部分(比如从开始到一半),而不必使用其他文件


谢谢你

如果您有足够的内存,请将其内容完全读取到内存中,将其复制回文件的前面,然后截断文件


如果没有足够的内存,请分块复制,并且仅在完成截断文件后进行。

如果有足够的内存,请将其内容完全读取到内存中,将其复制回文件前面,然后截断文件


如果您没有足够的内存,请分块复制,并且仅在完成截断文件后进行复制。

是的,这是可能的,但您仍必须重写大部分文件

大致思路如下:

open the file
beg = find the start of the fragment to be removed
len = length of the fragment to be removed
blocksize = 4096 -- example block size, may be any
datamoved = 0
do {
  fseek(pos +len +datamoved);
  if( endoffile ) return; -- finished!
  actualread = fread(buffer, blocksize)
  fseek(pos + datamoved)
  fwrite(buffer, actualread)
  datamoved += actualread
}

循环之后的最后一步是将文件“截断”为pos+datamoved大小。如果基础文件系统不处理“truncatefile”操作,则必须重写。。但是大多数文件系统和库都支持这一点。

是的,这是可能的,但仍然需要重写大部分文件

大致思路如下:

open the file
beg = find the start of the fragment to be removed
len = length of the fragment to be removed
blocksize = 4096 -- example block size, may be any
datamoved = 0
do {
  fseek(pos +len +datamoved);
  if( endoffile ) return; -- finished!
  actualread = fread(buffer, blocksize)
  fseek(pos + datamoved)
  fwrite(buffer, actualread)
  datamoved += actualread
}

循环之后的最后一步是将文件“截断”为pos+datamoved大小。如果基础文件系统不处理“truncatefile”操作,则必须重写。。但是大多数文件系统和库都支持这一点。

简单的回答是,不,大多数文件系统都不尝试支持这样的操作

这就给你留下了两个选择。最明显的一个方法是创建数据的副本,省去不需要的部分。您可以就地执行此操作(即在同一文件中移动数据),也可以使用辅助文件执行此操作,通常是将数据复制到新文件,然后执行类似于将新文件重命名为旧名称的操作


另一个主要选择是简单地重新构造文件和数据,这样就根本不需要删除旧数据。例如,如果要保留进程中最近的N个数据量,可以将(大部分)文件构造为循环缓冲区,开头有两个“指针”,告诉您头和尾点,以便知道从何处读取数据/将数据写入何处。对于这样的结构,您不需要擦除或删除旧数据,只需根据需要覆盖它。

简单的回答是,不需要,大多数文件系统都不尝试支持这样的操作

这就给你留下了两个选择。最明显的一个方法是创建数据的副本,省去不需要的部分。您可以就地执行此操作(即在同一文件中移动数据),也可以使用辅助文件执行此操作,通常是将数据复制到新文件,然后执行类似于将新文件重命名为旧名称的操作


另一个主要选择是简单地重新构造文件和数据,这样就根本不需要删除旧数据。例如,如果要保留进程中最近的N个数据量,可以将(大部分)文件构造为循环缓冲区,开头有两个“指针”,告诉您头和尾点,以便知道从何处读取数据/将数据写入何处。对于这样的结构,您不需要擦除或删除旧数据,只需根据需要覆盖它。

您接受使用RAM吗?我可以在内存中读取0.5个孔文件,删除它,然后写入0.5个我再次读取的数据。我想这就是OP试图避免的。简短回答:不,(至少大多数)文件系统不支持。你所能做的就是创建一个副本(在同一个或不同的文件中),去掉你不想要的部分。@JerryCoffin:如果你在答案中写下它,我会将它标记为已接受。你接受使用RAM吗?我可以在内存中读取0.5个孔文件,删除它,然后写入0.5个我再次读取的数据。我想这就是OP试图避免的。简短回答:不,(至少大多数)文件系统不支持。你所能做的就是创建一个副本(在同一个或不同的文件中),去掉你不想要的部分。@JerryCoffin:如果你在回答中写下它,我会将它标记为接受。但是文件可能太大,无法在内存中复制,即使在内存中读取块不是问题时,阻塞也会花费很长时间。时间的问题不在于内存,而在于I/O—文件越大,处理时间越长。但是文件可能太大,无法在内存中复制,即使在内存块中读取不是问题时,阻塞也会花费很长时间。时间的问题不在于内存,而在于I/O—文件越大,处理时间越长。仅供参考:在传统的HDD或FLOPPY或ZIP驱动器等上,以这种方式删除文件片段可能比将文件重写为新文件慢得多,因为回写可能会导致驱动器的磁头(嗯,seek:)可能,但不必。此外,如果您可以将代码绑定到特定的文件系统,您可能会发现一些低级操作实际上可以在文件的中间插入/重新排序/删除块/索引节点,那么您只需移动少量数据,但这是一件非常复杂的事情..仅供参考:在传统的HDD或FLOPPY或ZIP驱动器等上,以这种方式删除文件片段可能比将文件重写为新文件慢得多,因为回写可能会导致驱动器的磁头(嗯,seek:)可能,但不必。此外,如果您可以将代码绑定到特定的文件系统,您可能会发现一些低级操作实际上可以在文件的中间插入/重新排序/删除块/索引节点,那么您只需移动少量数据,但这是一件非常复杂的事。。