2011-02-25 34 views
1

我有一套大型图像文件,我在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

但建议只是没有在所有的工作,所以我与我更熟悉文件的功能去。不过,这就是我获得临时文件命名约定的地方。

回答

-1

您可以在写入图像后打开图像吗?听起来你也有麻烦吗?

你只是问为什么文件大小是不同的相同大小的图片?那么初始文件的大小如何相互比较呢?这可能与初始图像文件的压缩方式有关。

我不知道你在做什么与文件,但你有没有考虑过一个更基本的“复制”功能?

+0

没有压缩,这些是未压缩的未签名的短图像。写入后无法打开图像,我认为这与图像文件大小不合适有关。这不是一个复制功能,这是使用暂存空间来避免32位系统上的内存问题。 – mmr 2011-02-25 23:11:09

+0

请注意,这不是一个答案,而只是我认为相关的问题。通常情况下,我会在评论中提出这些意见,但是目前还没有足够的声誉。 – emragins 2011-02-26 21:12:59

+0

@ emragins--你分散注意力将这个问题想象成一个图像,而不仅仅是一个大文件。从代码中可以看到,在写入期间我根本没有压缩数据。这也不是复制操作,而是一种避免32位系统内存限制的方法。这个问题与fopen/fwrite/fread/fclose的行为不一致有关。 – mmr 2011-02-28 02:37:22