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