Skip to content
Snippets Groups Projects
Commit aa16b73b authored by Franck Dary's avatar Franck Dary
Browse files

Dict now print number of occurences

parent 72c543b6
Branches
No related tags found
No related merge requests found
...@@ -42,7 +42,7 @@ class Dict ...@@ -42,7 +42,7 @@ class Dict
void setState(State state); void setState(State state);
State getState() const; State getState() const;
void save(std::FILE * destination, Encoding encoding) const; void save(std::FILE * destination, Encoding encoding) const;
bool readEntry(std::FILE * file, int * index, char * entry, Encoding encoding); bool readEntry(std::FILE * file, int * index, int * nbOccsEntry, char * entry, Encoding encoding);
void printEntry(std::FILE * file, int index, const std::string & entry, Encoding encoding) const; void printEntry(std::FILE * file, int index, const std::string & entry, Encoding encoding) const;
std::size_t size() const; std::size_t size() const;
int getNbOccs(int index) const; int getNbOccs(int index) const;
......
...@@ -41,13 +41,17 @@ void Dict::readFromFile(const char * filename) ...@@ -41,13 +41,17 @@ void Dict::readFromFile(const char * filename)
elementsToIndexes.reserve(nbEntries); elementsToIndexes.reserve(nbEntries);
int entryIndex; int entryIndex;
int nbOccsEntry;
char entryString[maxEntrySize+1]; char entryString[maxEntrySize+1];
for (int i = 0; i < nbEntries; i++) for (int i = 0; i < nbEntries; i++)
{ {
if (!readEntry(file, &entryIndex, entryString, encoding)) if (!readEntry(file, &entryIndex, &nbOccsEntry, entryString, encoding))
util::myThrow(fmt::format("file '{}' line {} bad format", filename, i)); util::myThrow(fmt::format("file '{}' line {} bad format", filename, i));
elementsToIndexes[entryString] = entryIndex; elementsToIndexes[entryString] = entryIndex;
while (nbOccs.size() <= entryIndex)
nbOccs.emplace_back(0);
nbOccs[entryIndex] = nbOccsEntry;
} }
std::fclose(file); std::fclose(file);
...@@ -107,17 +111,19 @@ void Dict::save(std::FILE * destination, Encoding encoding) const ...@@ -107,17 +111,19 @@ void Dict::save(std::FILE * destination, Encoding encoding) const
printEntry(destination, it.second, it.first, encoding); printEntry(destination, it.second, it.first, encoding);
} }
bool Dict::readEntry(std::FILE * file, int * index, char * entry, Encoding encoding) bool Dict::readEntry(std::FILE * file, int * index, int * nbOccsEntry, char * entry, Encoding encoding)
{ {
if (encoding == Encoding::Ascii) if (encoding == Encoding::Ascii)
{ {
static std::string readFormat = "%d\t%"+std::to_string(maxEntrySize)+"[^\n]\n"; static std::string readFormat = "%d\t%d\t%"+std::to_string(maxEntrySize)+"[^\n]\n";
return fscanf(file, readFormat.c_str(), index, entry) == 2; return fscanf(file, readFormat.c_str(), index, nbOccsEntry, entry) == 3;
} }
else else
{ {
if (std::fread(index, sizeof *index, 1, file) != 1) if (std::fread(index, sizeof *index, 1, file) != 1)
return false; return false;
if (std::fread(nbOccsEntry, sizeof *nbOccsEntry, 1, file) != 1)
return false;
for (unsigned int i = 0; i < maxEntrySize; i++) for (unsigned int i = 0; i < maxEntrySize; i++)
{ {
if (std::fread(entry+i, 1, 1, file) != 1) if (std::fread(entry+i, 1, 1, file) != 1)
...@@ -131,14 +137,17 @@ bool Dict::readEntry(std::FILE * file, int * index, char * entry, Encoding encod ...@@ -131,14 +137,17 @@ bool Dict::readEntry(std::FILE * file, int * index, char * entry, Encoding encod
void Dict::printEntry(std::FILE * file, int index, const std::string & entry, Encoding encoding) const void Dict::printEntry(std::FILE * file, int index, const std::string & entry, Encoding encoding) const
{ {
auto entryNbOccs = getNbOccs(index);
if (encoding == Encoding::Ascii) if (encoding == Encoding::Ascii)
{ {
static std::string printFormat = "%d\t%s\n"; static std::string printFormat = "%d\t%d\t%s\n";
fprintf(file, printFormat.c_str(), index, entry.c_str()); fprintf(file, printFormat.c_str(), index, entryNbOccs, entry.c_str());
} }
else else
{ {
std::fwrite(&index, sizeof index, 1, file); std::fwrite(&index, sizeof index, 1, file);
std::fwrite(&entryNbOccs, sizeof entryNbOccs, 1, file);
std::fwrite(entry.c_str(), 1, entry.size()+1, file); std::fwrite(entry.c_str(), 1, entry.size()+1, file);
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment