写出大型临时文件时出现问题

发布于 2024-10-19 19:44:04 字数 2328 浏览 2 评论 0原文

我有一组大型图像文件,在 Visual Studio 2010 中用作 Windows 上的临时交换文件。我根据需要写入和读取这些文件。

问题是,即使每个文件大小相同,我也会得到不同的文件大小。

所以,我可以这样做:

template <typename T>
std::string PlaceFileOnDisk(T* inImage, const int& inSize)
    TCHAR lpTempPathBuffer[MAX_PATH];
    TCHAR szTempFileName[MAX_PATH];
    DWORD dwRetVal = GetTempPath(MAX_PATH, lpTempPathBuffer);
    UINT uRetVal = GetTempFileName(lpTempPathBuffer, TEXT("IMAGE"), 0, szTempFileName);

    FILE* fp;
    fopen_s(&fp, szTempFileName, "w+");
    fwrite(inImage, sizeof(T), inSize, fp);
    fclose(fp);

    std::string theRealTempFileName(szTempFileName);

    return theRealTempFileName;

}

但这会导致文件大小在 53 到 65 mb 之间(图像为 4713 * 5908 * sizeof (无符号短)。

我认为“fwrite”对于大文件可能不稳定,所以我将事情分解为:

template <typename T>
std::string PlaceFileOnDisk(T* inImage, const int& inYSize, const int& inXSize)
    TCHAR lpTempPathBuffer[MAX_PATH];
    TCHAR szTempFileName[MAX_PATH];
    DWORD dwRetVal = GetTempPath(MAX_PATH, lpTempPathBuffer);
    UINT uRetVal = GetTempFileName(lpTempPathBuffer, TEXT("IMAGE"), 0, szTempFileName);

    int y;
    FILE* fp;
    for (y = 0; y < inYSize; y++){
        fopen_s(&fp, szTempFileName, "a");
        fwrite(&(inImage[y*inXSize]), sizeof(T), inXSize, fp);
        fclose(fp);
    }

    std::string theRealTempFileName(szTempFileName);

    return theRealTempFileName;
}

同样的事情:保存到磁盘的文件大小不同,而不是预期的大小,

这是怎么回事?为什么它们不一样?

读入函数:

template <typename T>
T* RecoverFileFromDisk(const std::string& inFileName, const int& inSize){

    T* theBuffer = NULL;
    FILE* fp;
    try {
        theBuffer = new T[inYSize*inXSize];
        fopen_s(&fp, inFileName.c_str(), "r");
        fread(theBuffer, sizeof(T), inSize, fp);
        fclose(fp);
    }
    catch(...){
        if (theBuffer != NULL){
            delete [] theBuffer;
            theBuffer = NULL;
        }
    }
    return theBuffer;
}

这个函数可能遇到类似的问题,但是。我还没有做到这一点,因为我无法通过写入功能,

我确实尝试使用此页面上的读/写信息: http://msdn.microsoft.com/en -us/library/aa363875%28v=vs.85%29.aspx

但那里的建议根本不起作用,所以我使用了我更熟悉的文件函数。不过,这就是我获得临时文件命名约定的地方。

I have a set of large image files that I'm using as temporary swap files on Windows in Visual Studio 2010. I'm writing and reading the files out as necessary.

Problem is, even though each of the files are the same size, I'm getting different file sizes.

So, I can do:

template <typename T>
std::string PlaceFileOnDisk(T* inImage, const int& inSize)
    TCHAR lpTempPathBuffer[MAX_PATH];
    TCHAR szTempFileName[MAX_PATH];
    DWORD dwRetVal = GetTempPath(MAX_PATH, lpTempPathBuffer);
    UINT uRetVal = GetTempFileName(lpTempPathBuffer, TEXT("IMAGE"), 0, szTempFileName);

    FILE* fp;
    fopen_s(&fp, szTempFileName, "w+");
    fwrite(inImage, sizeof(T), inSize, fp);
    fclose(fp);

    std::string theRealTempFileName(szTempFileName);

    return theRealTempFileName;

}

but that results in files between 53 and 65 mb in size (the image is 4713 * 5908 * sizeof (unsigned short).

I figured that maybe that 'fwrite' might not be stable for large files, so I broke things up into:

template <typename T>
std::string PlaceFileOnDisk(T* inImage, const int& inYSize, const int& inXSize)
    TCHAR lpTempPathBuffer[MAX_PATH];
    TCHAR szTempFileName[MAX_PATH];
    DWORD dwRetVal = GetTempPath(MAX_PATH, lpTempPathBuffer);
    UINT uRetVal = GetTempFileName(lpTempPathBuffer, TEXT("IMAGE"), 0, szTempFileName);

    int y;
    FILE* fp;
    for (y = 0; y < inYSize; y++){
        fopen_s(&fp, szTempFileName, "a");
        fwrite(&(inImage[y*inXSize]), sizeof(T), inXSize, fp);
        fclose(fp);
    }

    std::string theRealTempFileName(szTempFileName);

    return theRealTempFileName;
}

Same thing: the files that are saved to disk are variable sized, not the expected size.

What's going on? Why are they not the same?

The read in function:

template <typename T>
T* RecoverFileFromDisk(const std::string& inFileName, const int& inSize){

    T* theBuffer = NULL;
    FILE* fp;
    try {
        theBuffer = new T[inYSize*inXSize];
        fopen_s(&fp, inFileName.c_str(), "r");
        fread(theBuffer, sizeof(T), inSize, fp);
        fclose(fp);
    }
    catch(...){
        if (theBuffer != NULL){
            delete [] theBuffer;
            theBuffer = NULL;
        }
    }
    return theBuffer;
}

This function may be suffering from similar problems, but I'm not getting that far, because I can't get past the writing function.

I did try to use the read/write information on this page:
http://msdn.microsoft.com/en-us/library/aa363875%28v=vs.85%29.aspx

But the suggestions there just didn't work at all, so I went with the file functions with which I'm more familiar. That's where I got the temp file naming conventions, though.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

み零 2024-10-26 19:44:04

写完后能打开图片吗?看来你写起来也有困难?

您只是想问为什么相同尺寸的图片的文件大小不同?初始文件的大小相互比较怎么样?这可能与初始图像文件的压缩方式有关。

我不确定您对这些文件做了什么,但是您是否考虑过更基本的“复制”功能?

Are you able to open the image after it's written? It sounds like you're having trouble writing it, too?

You're just asking about why the file sizes are different for the same size picture? What about how the sizes of the initial files compare to each other? It may have something to do with the how the initial image files are compressed.

I'm not sure what you're doing with the files, but have you considered a more basic "copy" function?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文