C++ 什么';这是在C/C+;中创建1GB文件并填充零的最快方法+;?
我需要在Windows操作系统中创建一个巨大的二进制文件,其中包含零。给出了它的大小。在C/C++中最有效的方法是什么?“最快”取决于平台。在unix上,使用open和write系统调用;请确保使用大缓冲区(~1MB)调用write。尝试调用C++ 什么';这是在C/C+;中创建1GB文件并填充零的最快方法+;?,c++,windows,file-io,C++,Windows,File Io,我需要在Windows操作系统中创建一个巨大的二进制文件,其中包含零。给出了它的大小。在C/C++中最有效的方法是什么?“最快”取决于平台。在unix上,使用open和write系统调用;请确保使用大缓冲区(~1MB)调用write。尝试调用truncate(2): 欲了解更多信息 man 2 truncate truncate()和ftruncate()函数将导致按路径命名或由fd引用的常规文件被截断为精确长度为字节的大小 如果以前的文件大于此大小,则会丢失额外的数据。如果以前的文件较短,则
truncate(2)
:
欲了解更多信息
man 2 truncate
truncate()和ftruncate()函数将导致按路径命名或由fd引用的常规文件被截断为精确长度为字节的大小
如果以前的文件大于此大小,则会丢失额外的数据。如果以前的文件较短,则会对其进行扩展,扩展部分将读取为空字节('\0')
如果您正在查找Windows本机函数,请看一看,它的作用大致相同。如果文件确实需要全零,那么除了写入所有数据之外,没有其他方法。我可能会使用与驱动器块大小相同的缓冲区,并在循环中写入,直到写入到所需的大小
如果文件可能包含数据未定义的“孔”(磁盘上已经存在的内容),则可以将其搜索到指定大小并写入一个字节。可能这就是您要查找的,
稀疏文件。这些类型的文件通常由文件共享程序创建
如果有人想知道我是如何在这里解决问题的:
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);
}
你使用哪种操作系统?你使用哪种操作系统?您是否正在寻找一种独立于平台的方法来实现这一点?这应该适用于任何符合POSIX-2001的系统,可能还有一些不适用。它至少存在于Mac、Unix和Linux上。不确定Windows.AFAIK,truncate会创建一个稀疏文件。如果他最终需要把这些零写出来,那绝对不会太快。
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);
}