我有一套大型圖像文件,我在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
但建議只是沒有在所有的工作,所以我與我更熟悉文件的功能去。不過,這就是我獲得臨時文件命名約定的地方。
沒有壓縮,這些是未壓縮的未簽名的短圖像。寫入後無法打開圖像,我認爲這與圖像文件大小不合適有關。這不是一個複製功能,這是使用暫存空間來避免32位系統上的內存問題。 – mmr 2011-02-25 23:11:09
請注意,這不是一個答案,而只是我認爲相關的問題。通常情況下,我會在評論中提出這些意見,但是目前還沒有足夠的聲譽。 – emragins 2011-02-26 21:12:59
@ emragins--你分散注意力將這個問題想象成一個圖像,而不僅僅是一個大文件。從代碼中可以看到,在寫入期間我根本沒有壓縮數據。這也不是複製操作,而是一種避免32位系統內存限制的方法。這個問題與fopen/fwrite/fread/fclose的行爲不一致有關。 – mmr 2011-02-28 02:37:22