У меня есть набор больших файлов изображений, которые я использую в качестве временных файлов подкачки в Windows в Visual Studio 2010. Я пишу и считываю файлы по мере необходимости.
Проблема в том, что, хотя каждый из файлов имеет одинаковый размер, я получаю файлы разных размеров.
Итак, я могу сделать:
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 МБ (размер изображения 4713 *5908* (без знака).
Я подумал, что, возможно, что '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
Но предложения там просто не сработали, поэтому я остановился на файловых функциях, с которыми я более знаком. Вот где я получил соглашения о присвоении имен временным файлам.