C++ 什么';这是在C/C+;中创建1GB文件并填充零的最快方法+;?

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引用的常规文件被截断为精确长度为字节的大小 如果以前的文件大于此大小,则会丢失额外的数据。如果以前的文件较短,则

我需要在Windows操作系统中创建一个巨大的二进制文件,其中包含零。给出了它的大小。在C/C++中最有效的方法是什么?

“最快”取决于平台。在unix上,使用open和write系统调用;请确保使用大缓冲区(~1MB)调用write。

尝试调用
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);
}