gpt4 book ai didi

c++ - 使用 std::filebuf 未反射(reflect)文件大小调整

转载 作者:太空狗 更新时间:2023-10-29 21:41:13 25 4
gpt4 key购买 nike

我创建了一个空文件,我正在尝试调整它的大小。除了打开模式外,我的调整大小和创建代码非常相似。初始创建按预期工作。调整大小的代码执行得很好,但文件大小调整没有反射(reflect)出来。

这是我的代码:

void resize()
{
std::filebuf fileBuffer;
fileBuffer.open(filePath, ios::out | ios::binary | ios::app);
if (fileBuffer.is_open())
{
fileBuffer.pubseekoff((2 * fileSize) - 1, ios::beg);
auto x = fileBuffer.sputc(0);
fileBuffer.close();
}
}

int main()
{
std::filebuf fileBuffer;
fileBuffer.open(filePath, ios::out | ios::trunc | ios::binary);
if (fileBuffer.is_open())
{
fileBuffer.pubseekoff(fileSize - 1, ios::beg);
fileBuffer.sputc(0);
fileBuffer.close();
}
resize(); // Doesn't work

resizeWithData(); // Works
}

当我尝试通过将实际数据推送到文件中来调整文件大小时,如下所示,它起作用了:

void resizeWithData()
{
ofstream fstr(filePath, ios::out | ios::binary | ios::app);
if (fstr.is_open())
{
const auto emptySec = make_unique<char[]>(fileSize);
memset(emptySec.get(), 0, fileSize);
fstr.write(emptySec.get(), fileSize);
fstr.close();
}
}

为什么会有这种差异?我的实际场景涉及创建和调整非常大的文件(1 GB 或更多),所以我希望我可以尽可能避免为空数据分配内存,如上面的代码所示(因为它真的很慢)

P.S.:我正在使用 VS2013 更新 4 的 Windows 7

最佳答案

resize() 失败的原因是因为您在 app 模式下打开了文件。每次写入此流时,实现都会将写入位置重新同步到文件末尾。对 pubseekoff 本身的调用,它调用 seekoff,这是根据 fseek 定义的,不写任何东西,它只是重新定位文件位置指示器。

从你在 main 打开的文件中可以看出,没有 app 标志 sputc 将立即写入当前位置,虽然这可能无法得到严格保证。

大多数basic_filebuf操作都是根据C文件函数定义的,其中似乎没有提到当文件位置指示器调用fputc时会发生什么超出文件末尾。然而,POSIX 明确表示这会将零写入该位置,您可能会发现大多数实现都支持此定义。

关于c++ - 使用 std::filebuf 未反射(reflect)文件大小调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29486233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com