1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
/*
This file is a part of KMC software distributed under GNU GPL 3 licence.
The homepage of the KMC project is http://sun.aei.polsl.pl/kmc
Authors: Sebastian Deorowicz, Agnieszka Debudaj-Grabysz, Marek Kokot
Version: 3.2.4
Date : 2024-02-09
*/
#include "mem_disk_file.h"
#include "critical_error_handler.h"
#include <sstream>
using namespace std;
//----------------------------------------------------------------------------------
// Constructor
CMemDiskFile::CMemDiskFile(bool _memory_mode)
{
memory_mode = _memory_mode;
file = nullptr;
}
//----------------------------------------------------------------------------------
void CMemDiskFile::Open(const string& f_name)
{
if(memory_mode)
{
}
else
{
file = fopen(f_name.c_str(), "wb+");
if (!file)
{
std::ostringstream ostr;
ostr << "Error: Cannot open temporary file " << f_name;
CCriticalErrorHandler::Inst().HandleCriticalError(ostr.str());
}
setbuf(file, nullptr);
}
name = f_name;
}
//----------------------------------------------------------------------------------
void CMemDiskFile::Rewind()
{
if(memory_mode)
{
}
else
{
rewind(file);
}
}
//----------------------------------------------------------------------------------
int CMemDiskFile::Close()
{
if(memory_mode)
{
for(auto& p : container)
{
delete[] p.first;
}
container.clear();
return 0;
}
else
{
if (file)
{
auto ret = fclose(file);
file = nullptr;
return ret;
}
else
return 0;
}
}
//----------------------------------------------------------------------------------
void CMemDiskFile::Remove()
{
if (!memory_mode)
remove(name.c_str());
}
//----------------------------------------------------------------------------------
size_t CMemDiskFile::Read(uchar * ptr, size_t size, size_t count)
{
if(memory_mode)
{
uint64 pos = 0;
for(auto& p : container)
{
memcpy(ptr + pos, p.first, p.second);
pos += p.second;
delete[] p.first;
}
container.clear();
return pos;
}
else
{
return fread(ptr, size, count, file);
}
}
//----------------------------------------------------------------------------------
size_t CMemDiskFile::Write(const uchar * ptr, size_t size, size_t count)
{
if(memory_mode)
{
uchar *buf = new uchar[size * count];
memcpy(buf, ptr, size * count);
container.push_back(make_pair(buf, size * count));
return size * count;
}
else
{
return fwrite(ptr, size, count, file);
}
}
//----------------------------------------------------------------------------------
CMemDiskFile::~CMemDiskFile()
{
Close();
Remove();
}
// ***** EOF
|