在 C/C++ 中创建充满零的 1GB 文件的最快方法是什么?
What's the fastest way to create 1GB file filled with zeros in C/C++?
我需要在Windows操作系统中创建一个用零填充的巨大二进制文件。给出了它的大小。在C/C++中最有效的方法是什么?
尝试调用truncate(2)
:
truncate("/my/file", my_size);
更多信息,
man 2 truncate
truncate()和ftruncate()函数会将按路径命名或由fd引用的常规文件截断为精确长度的字节大小。
如果以前的文件大于此大小,则会丢失额外的数据。如果以前的文件较短,则对其进行扩展,并且扩展部分读取为空字节("\0")。
如果您正在寻找Windows本机函数,请查看SetEndOfFile,它的作用大致相同。
如果文件真的需要全为零,那么除了写入所有数据之外,没有其他方法了。我可能会使用与驱动器块大小相同的缓冲区来完成这项工作,并在循环中写入,直到写入到您想要的大小。
如果该文件可以包含";孔";在数据未定义的地方(实际上磁盘上已经有什么了),可以查找指定的大小并写入一个字节。像这样的洞实际上会被读取为零。
如果有人想知道我是如何在这里解决问题的:
void CreateBlankFile(LPSTR str, long lsize) {
DWORD dwErr;
HANDLE file = CreateFile(str,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
dwErr = GetLastError();
if (dwErr > 0) {
//some error message should be here
return;
}
SetFilePointer(file, lsize, 0, FILE_BEGIN);
SetEndOfFile(file);
CloseHandle(file);
}
"Fastest"依赖于平台。在unix上,使用开放和编写系统调用;请确保使用大缓冲区(~1MB)调用write。
也许这就是您想要的SPARSE
文件。这些类型的文件通常由文件共享程序创建。。。
http://www.flexhex.com/docs/articles/sparse-files.phtml
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 写入超过 1GB 的.txt文件时出现奇怪的行为
- 如何有效地读取和存储 1GB 文本文件中的数据
- 无法使用Qt下载>= 1GB 的文件
- 在 C/C++ 中创建充满零的 1GB 文件的最快方法是什么?
- 在具有1GB RAM的机器上对1TB文件进行排序
- 我们如何将一个100gb的文件分割成100个1gb的文件?
- 如何克服读取大文件(超过1GB)时的内存错误——C/ c++
- 在C++中,将大型二进制(1GB-4GB)文件加载到内存中的最快方法是什么