我創建了一個空文件,我正在嘗試調整它。除了開放模式外,我的調整大小和創建代碼非常相似。初始創建按預期工作。調整大小的代碼執行得很好,但文件調整大小沒有反映出來。文件大小不反映使用std :: filebuf
這裏是我的代碼:
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或更多),所以我希望我可以避免爲空數據分配內存,如上面的代碼所示(因爲它真的很慢)如果可能的話
PS:我正在使用VS2013更新4上的windows 7 7
但是,如果是這樣的話,爲什麼獨創的文件,而無需實際把這些有多少位工作? – Arun
爲什麼你使用'std :: file_buf'而不是'std :: fstream'? cppreference說mehtod的基本版本沒有效果。請參閱http://en.cppreference。COM/W/CPP/IO/basic_streambuf/pubseekoff。 – Lingxi
@靈溪不,'std :: basic_streambuf :: pubseekoff'沒有效果;但是他調用了'std :: basic_filebuf :: pubseekoff',但是這個被覆蓋。 – edmz