【发布时间】:2015-04-07 15:40:29
【问题描述】:
我想从一个文件向后读取 - 从结尾到开头。 这行得通,但我不仅想从文件中获取字符,还想在阅读时删除它们。
std::fstream fileA;
fileA.seekg(-1, fileA.end);
int size = fileA.tellg();
for (i = 1; i <= size; i++)
{
fileA.seekg(-i, fileA.end);
fileA.get(ch);
std::cout << ch;
}
有没有办法做到这一点,而不复制内容并在没有我读过的内容的情况下创建一个新文件?
【问题讨论】:
-
“这行得通”:我想知道你是否尝试过 utf8 文件
-
记事本说它是 UTF 8 没有 BOM 。那有关系吗?这些代码适用于阅读...... @Christophe
-
您的方法中的问题是多字节 UTF8 字符。我们以小派为例:它的UTF8编码是0xCF 0x80。如果您在输出中写入 0x80 0xCF ,则它是无效的 UTF8 序列。但是对于任何文本,在 windows 下都会出现同样的问题:'\n' 在文件中被编码为 0x0D 0x0A。在文本模式下阅读时,阅读此序列时您只会得到 '\n'。但是使用您的方法,您将首先定位在 0x0A 上,这将为您提供 '\n',然后您将定位在 0x0D 上,这将再次被读取为 '\n'(因为它后面是 0x0A)。所以你会加倍每个换行符。
-
你看过this吗?
-
@Christophe:这对于 UTF-8 或 UTF-16 来说很容易解决——你可以从值中看出 0x80 是多字节序列的一部分,你可以告诉您何时到达第一个字节。但是,处理组合变音符号要困难得多 - 当您阅读一个代码点时,除了阅读前面的代码点之外,您不知道它是否可以在它之前加上一个组合变音符号。跨度>