2011-02-25 33 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