diff --git a/common/include/Dict.hpp b/common/include/Dict.hpp index e88d07f6614d91bdd6cb252bc9a742701c5779a7..2aef8884592237a46dd8f745b69809de03eb6cc6 100644 --- a/common/include/Dict.hpp +++ b/common/include/Dict.hpp @@ -42,7 +42,7 @@ class Dict void setState(State state); State getState() 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; std::size_t size() const; int getNbOccs(int index) const; diff --git a/common/src/Dict.cpp b/common/src/Dict.cpp index ffaca442c3279215e237c523f50c445385395378..8199f8383e27062d18f40af6e40eeff41ac2563e 100644 --- a/common/src/Dict.cpp +++ b/common/src/Dict.cpp @@ -41,13 +41,17 @@ void Dict::readFromFile(const char * filename) elementsToIndexes.reserve(nbEntries); int entryIndex; + int nbOccsEntry; char entryString[maxEntrySize+1]; 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)); elementsToIndexes[entryString] = entryIndex; + while (nbOccs.size() <= entryIndex) + nbOccs.emplace_back(0); + nbOccs[entryIndex] = nbOccsEntry; } std::fclose(file); @@ -107,17 +111,19 @@ void Dict::save(std::FILE * destination, Encoding encoding) const 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) { - static std::string readFormat = "%d\t%"+std::to_string(maxEntrySize)+"[^\n]\n"; - return fscanf(file, readFormat.c_str(), index, entry) == 2; + static std::string readFormat = "%d\t%d\t%"+std::to_string(maxEntrySize)+"[^\n]\n"; + return fscanf(file, readFormat.c_str(), index, nbOccsEntry, entry) == 3; } else { if (std::fread(index, sizeof *index, 1, file) != 1) return false; + if (std::fread(nbOccsEntry, sizeof *nbOccsEntry, 1, file) != 1) + return false; for (unsigned int i = 0; i < maxEntrySize; i++) { 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 void Dict::printEntry(std::FILE * file, int index, const std::string & entry, Encoding encoding) const { + auto entryNbOccs = getNbOccs(index); + if (encoding == Encoding::Ascii) { - static std::string printFormat = "%d\t%s\n"; - fprintf(file, printFormat.c_str(), index, entry.c_str()); + static std::string printFormat = "%d\t%d\t%s\n"; + fprintf(file, printFormat.c_str(), index, entryNbOccs, entry.c_str()); } else { std::fwrite(&index, sizeof index, 1, file); + std::fwrite(&entryNbOccs, sizeof entryNbOccs, 1, file); std::fwrite(entry.c_str(), 1, entry.size()+1, file); } }