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 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
| //DCF.cpp
#include "DCF.h"
//Constructeurs
DCF::DCF(const char* file)
{
//Nom du fichier
FileName = file;
Init();
}
void DCF::Init()
{
//Supression de la liste des fichiers
ListFile.clear();
//Flux vers le fichier
std::ifstream File(FileName.c_str());
FileStart = 0;
//Chargement de la liste des fichiers
std::string Buffer;
long laststart = 0;
while(getline(File, Buffer, '\255'))
{
//Vérification de chaine "valide"
if(Buffer.find('\001') == -1)
break;
//Position de départ
FileStart += Buffer.size()+1;
//Ajout du nouveau fichier a la liste
StSi Location;
std::string filename;
filename = Buffer.substr(0, Buffer.find('\001'));
Location.Size = std::from_string<long>(Buffer.substr(Buffer.find('\001')+1, Buffer.size()-Buffer.find('\001')+1));
Location.Start = laststart;
laststart += Location.Size;
ListFile[filename] = Location;
}
File.close();
}
//Destructeur
DCF::~DCF()
{
}
//Write
void DCF::Write(const char* name, std::string Content)
{
//Supression si le fichier existe déja
if(ListFile.find(name) != ListFile.end())
Delete(name);
//Chargement du fichier
if(!Content.size())
return;
//Variable temporaire de sauvegarde
char *content;
//Sauvegarde du contenu
{
std::ifstream File(FileName.c_str());
File.seekg(FileStart);
long Width = std::size<long>(File)-FileStart;
content = new char[Width+1];
File.read(content, Width);
content[Width] = '\0';
File.close();
}
//Ecriture de la table
{
std::ofstream Out(FileName.c_str());
for(TListFile::iterator i = ListFile.begin(); i != ListFile.end(); i++)
Out << i->first << '\001' << i->second.Size << '\255';
Out << name << '\001' << Content.size() << '\255';
Out << content;
Out << Content;
}
//Supression de la variable temporaire
delete [] content;
//Re-Initialisation
Init();
}
void DCF::Write(const char* file)
{
//Supression si le fichier existe déja
if(ListFile.find(file) != ListFile.end())
Delete(file);
//Chargement du fichier
std::ifstream Load(file);
if(!Load || !std::size<long>(Load))
return;
//Variable temporaire de sauvegarde
char *content;
//Sauvegarde du contenu
{
std::ifstream File(FileName.c_str());
File.seekg(FileStart);
long Width = std::size<long>(File)-FileStart;
content = new char[Width+1];
File.read(content, Width);
content[Width] = '\0';
File.close();
}
//Ecriture de la table
{
std::ofstream Out(FileName.c_str());
for(TListFile::iterator i = ListFile.begin(); i != ListFile.end(); i++)
Out << i->first << '\001' << i->second.Size << '\255';
Out << file << '\001' << std::size<long>(Load) << '\255';
Out << content;
Out << Load.rdbuf();
}
Load.close();
//Supression de la variable temporaire
delete [] content;
//Re-Initialisation
Init();
}
//Read
std::string DCF::Read(const char* file)
{
//Exclusion des fichiers inexistants
if(ListFile.find(file) == ListFile.end())
return "";
//Chargement des Size premier caractères
std::ifstream File(FileName.c_str());
File.seekg(FileStart + ListFile[file].Start);
char *content = new char[ListFile[file].Size+1];
File.read(content, ListFile[file].Size);
content[ListFile[file].Size] = '\0';
std::string FContent(content);
delete[] content;
//Fermeture
File.close();
return FContent;
}
//Delete
void DCF::Delete(const char* file)
{
//Verification de l'existance
if(ListFile.find(file) == ListFile.end())
return;
//Chargement du fichier
std::string Buffer;
{
std::ifstream Load(FileName.c_str());
std::stringstream Convert;
Convert << Load.rdbuf();
Buffer = Convert.str();
Load.close();
}
Buffer = Buffer.substr(FileStart);
//Supression des données
std::cout << "Supression_Buffer = " << Buffer << '\n';
Buffer = Buffer.substr(0, ListFile[file].Start) + Buffer.substr(ListFile[file].Start+ListFile[file].Size);
std::cout << "Supression_Buffer = " << Buffer << '\n';
//Supression de la clef
ListFile.erase(ListFile.find(file));
//Ecriture de la table
{
std::ofstream Out(FileName.c_str());
for(TListFile::iterator i = ListFile.begin(); i != ListFile.end(); i++)
Out << i->first << '\001' << i->second.Size << '\255';
Out << Buffer;
}
//Re-Initialisation
Init();
}
//DCF.h
#ifndef SDL_TEXTURE_H
#define SDL_TEXTURE_H
#ifndef DLL_Act
#ifdef BUILD_DLL
#define DLL_ACT __declspec(dllexport)
#else
#define DLL_ACT __declspec(dllimport)
#endif
#endif
//Fonctions costum pour taille d'un fichier, convertion des chaines de caractères...
#include "Cstring.h"
#include "Cfile.h"
//STL
#include <sstream>
#include <fstream>
#include <map>
#include <iostream>
class DLL_ACT DCF
{
public:
DCF(const char* file);
~DCF();
void Init();
void Write (const char* file);
void Write (const char* name, std::string Content);
std::string Read (const char* file);
void Delete(const char* file);
//private:
struct StSi
{
long Start;
long Size;
};
typedef std::map<std::string, StSi> TListFile;
TListFile ListFile;
std::string FileName;
long FileStart;
};
#endif |
Partager