c++ - 如何在最后一个 EOL 后删除文件内容?

标签 c++ file fstream

我有一些内部文件,只能附加到每个附加 \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/

相关文章:

c++ - OpenCL 的问题(opencl.dll、AMD APP SDK、cl.h)

c++ - 如何在没有竞争条件的情况下将 QFutureWatcher 与 QtConcurrent::run() 一起使用

node.js - 如何增量写入文本文件并刷新输出

Java如何将特定字符串逐行写入文本文件(Tesseract输出)

c++ - Visual Studio TODO/任务列表未显示

c++ - 屏幕上的 UE4 打印位置

python - 使用Python按行读取文件时出现OSError : [Errno 22] Invalid argument,

c++ - 编译器 C++ 中的 fstream 错误

c++ - 打开一个 fstream 进行读/写(二进制)

c++ - 从 fstream 读取后,为什么在写入之前似乎需要清除其 goodbit ?