Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

  1. Créez un répertoire TP14/ avec la structure suivante :

TP14/
├── csv-utils/
│    ├── include/
│    │   └── csv-utils.h
│    ├── source/
│    │   └── csv-utils.cpp
│    ├── compile_flags.txt   
│    └── makefile
├── LICENSE
└── README.md
  1. Remplissez les fichiers suivants et laissez les autres fichiers vides pour l’instant.

csv-utils.h
csv-utils.cpp
compile_flags.txt
makefile
#ifndef CSV_UTILS_H
#define CSV_UTILS_H

#include <map>
#include <string>
#include <vector>
#include <fstream>

using CsvRow = std::map<std::string, std::string>;
using CsvTable = std::vector<CsvRow>;

class CsvUtils {
public:
    static CsvTable readFile(const std::string& filePath);
    static void writeFile(const std::string& filePath, const CsvTable& table);
    static std::vector<std::string> getColumnNames(const CsvTable& table);
    static std::string getValue(const CsvTable& table, int rowIndex, const std::string& columnName);

private:
    static constexpr char SEPARATOR = ';';
    static constexpr char QUOTE = '"';

    static std::vector<std::string> splitLine(const std::string& line);
    static void checkColumnCount(const std::vector<std::string>& headers, const std::vector<std::string>& values);
    static void checkColumnNames(const std::vector<std::string>& expectedColumns, const std::vector<std::string>& actualColumns);
    static CsvRow buildRow(const std::vector<std::string>& headers, const std::vector<std::string>& values);
    static void writeHeaders(std::ofstream& file, const std::vector<std::string>& headers);
    static void writeValues(std::ofstream& file, const CsvRow& row, const std::vector<std::string>& headers);
    static void checkQuotes(const std::string& value);
};

#endif

Nous allons apprendre à documenter un mini-projet CsvUtils qui est une bibliothèque C++ permettant de lire, écrire et interroger des fichiers CSV simples.

Lecture du code

D’abord, essayons de comprendre le code avant de rajouter des commentaires et la documentation.

  1. Regardez le contenu de csv-utils.h.

  1. Regardez le code de checkQuotes.

  1. Regardez le code de readFile. Comprenez-vous pourquoi la première ligne est traitée séparément ?

  1. Regardez le code de splitLine. Comprenez-vous pourquoi nous faisons values.push_back(currentValue) après la boucle for (char character : line) ?

  1. Regardez le code de buildRow puis checkColumnCount.

  1. Regardez le code de writeFile puis getColumnNames et checkColumnNames.

  1. Finalement, regardez le code de writeHeaders, writeValues et getValue.

Commenter

  1. Après avoir compris le code, ajoutez des commentaires pour clarifier ou souligner l’importance des différentes parties du code.

Documenter

  1. Documentez la classe CsvUtils comme vu en cours.

README

  1. Remplissez votre README.md en commençant par le titre et une description générale de ce mini-projet.

  2. Ajoutez une section Fonctionnalités principales avec une courte description des (quatre) fonctionnalités principales.

  3. Ajoutez une section Documentation avec un lien ou chemin vers la documentation depuis la racine du projet qui sera /csv-utils/docs/html/index.html quand nous allons générer la documentation avec Doxygen dans la partie suivante.

  4. Ajoutez une section Installation avec les instructions suivantes.

  1. Créez le répertoire TP14/my-app/ avec la structure suivante.

TP14/my-app/
└── external/csv-utils/
    ├── include/
    │   └── csv-utils.h
    ├── lib/
    │   └── libcsvutils.a
    ├── main.cpp   
    ├── compile_flags.txt   
    └── makefile
  1. Recopiez le contenu suivant dans les fichiers correspondants.

main.cpp
compile_flags.txt
makefile
#include "csv-utils.h"

#include <iostream>

int main() {
    CsvTable table = {
        {{"name", "Alice"}, {"grade", "20"}},
        {{"name", "Bob"}, {"grade", "19"}}
    };

    CsvUtils::writeFile("students.csv", table);

    CsvTable loadedTable = CsvUtils::readFile("students.csv");

    std::cout << CsvUtils::getValue(loadedTable, 0, "name") << '\n';
    std::cout << CsvUtils::getValue(loadedTable, 0, "grade") << '\n';

    return 0;
}
  1. Testez le code de my-app/ vous-même avec make et make run.

  2. Ajoutez une section Utilisation où vous donnez des exemples d’utilisation des fonctionnalités principales.

  3. Ajoutez une sous-section Limitations à Utilisation où vous expliquez les limitations sur les fichiers CSV que nous pouvons lire ou écrire.

  4. Ajoutez une section Licence qui indique que ce mini-projet est distribué sous licence MIT et recopiez la licence MIT dans le cours (en modifiant l’en-tête) dans le fichier LICENSE.

Doxyfile

Pour générer la documentation avec Doxygen, nous allons d’abord générer un fichier de configuration Doxyfile.

  1. Générez le Doxyfile avec la commande suivante dans csv-utils/ :

doxygen -g
  1. Modifiez les paramètres suivants du Doxyfile :

  1. Générez la documentation avec la commande suivante dans csv-utils/ :

doxygen Doxyfile

Vous devez voir un répertoire docs/ dans csv-utils/ qui contient le contenu de votre documentation.

  1. Consultez la documentation générée en ouvrant csv-utils/docs/html/index.html dans un navigateur web.

À retenir