我有一些内部文件,只能附加到每个附加 \n
字符后添加到文件中。但是从理论上讲,附加到文件可能会失败并且文件已损坏。这就是为什么每次打开文件时我都想在最后一个 EOL 之后寻找它的最后一个有效位置。此代码将执行此操作:
// Not using ios::app instead of ios::ate | ios::out because it will
// put print pointer to the EOF every time before writing.
fstream file(name.c_str(), ios::binary | ios::ate | ios::out | ios::in);
if(!file.is_open()) {
cerr << "Error in oppening file " << name << endl;
exit(EXIT_FAILURE);
} else {
while(0 != file.tellp()) //if file is not empty
{
file.seekg(-1, ios_base::cur);
if(0 == file.tellg() || file.get() == '\n') {
break;
}
file.seekg(-1, ios_base::cur);
}
file.seekp(of.tellg());
}
//{1}
//Use file for appending to...
但是如果应该附加到文件的部分的长度小于从文件中最后一个 EOL 字符开始的部分的长度,它就不会正常工作。这就是为什么在 {1}
位置我想删除从 file.tellp() 开始到结尾的文件内容。
我该怎么做?
最佳答案
你不能,便携。不同的系统有不同的做事方式 这个,但通常只在系统文件句柄上。唯一有保障的 缩短文件的方法是将其复制到另一个文件中,而不是复制 不想要的,然后删除原始文件并重命名新文件。
如果它是一个文本文件(不是二进制文件),而你在 windows 下,写一个 该位置的 0x1A 可能有效。在 Unix 下没有类似的东西, 然而。
在您的情况下,仅仅覆盖结尾就足够了。如果更糟
变得更糟,您需要附加的内容不足以
覆盖尾随数据,你可以尝试用一些东西覆盖它
无害且易于识别,如 '\0'
。 (正式地,写作
像这样的东西,或者 0x1A,到文本文件是未定义的行为。
实际上,它会起作用。)
(当我不得不解决类似的问题时,我采用了写作的策略 记录头部 block 的 CRC;在阅读时,我忽略了 CRC 错误的任何内容。)
关于c++ - 如何在最后一个 EOL 后删除文件内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10243653/