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
| #include <iostream>
#include <string>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
std::vector<std::string> readSentence(int argc, char * argv){
if(argc<=3){
throw std::runtime_error("instruction should be followed with one word min");
}
std::vector<std::string> tab;
for(int i=3; i<argc;++i){
tab.emplace_back(argv[i]);
}
return tab;
}
/* on recrée la phrase, sur base de chaque mot */
std::string createSentence(std::vector<std::string> const & words){
size_t count(0);
std::string sentence;
for(auto const & it : words){
sentence+= it;
++count;
if(count <words.size())
sentence+=" ";
}
return sentence;
}
/* Par facilité, on pourrait créer une énumération permettant de représenter les instruction */
enum Instructions{
addToText,
list,
delFromText,
MAXINSTRUCTIONS
};
/* Grâce à elle, nous pouvons analyser l'instruction qui est donnée sous une forme proche de */
Instructions selectInstruction(std::string const & str){
if(str == "-a")
return Instructions::addToText;
if(str=="-d")
return Instructions::delFromText;
if(str=="-ls")
return Instructions::list;
return Instructions::MAXINSTRUCTIONS;
}
/* on s'assure que le premier paramètre est "todo" */
void checkFirstArg(std::string const & str){
if(str!="todo")
throw std::runtime_error("first argument should be ''todo''");
}
void add(std::string file, std::string prm) {
std::ofstream monFlux(file, std::ios::out);
if(monFlux) {
monFlux << prm << std::endl;
}
else {
std::cout << "ERREUR: Impossible d'ouvrir le fichier." << std::endl;
}
}
void del(std::string file, int ln) {
std::string Buffer = ""; //Variable contenant le texte à réécrire dans le fichier
std::ifstream ReadFile(file);
if (ReadFile) { //Si le fichier est trouvé
std::string line;
int Line = 0;
while(std::getline(ReadFile, line)) { //on parcours le fichier et on initialise line à la ligne actuelle
Line++;
if(Line != ln) //Si la ligne atteinte est différente de la ligne à supprimer...
Buffer += line + "\n"; //On ajoute le contenu de la ligne dans le contenu à réécrire
}
} else {
std::cout << "ERREUR: Impossible d'ouvrir le fichier." << std::endl;
}
std::ofstream WriteFile(file); //On ouvre ce même fichier en écriture
WriteFile << Buffer; //On écris le texte dedans
}
void less(std::string file) {
std::ifstream ReadFile(file);
if(ReadFile) {
std::string line;
while(std::getline(ReadFile, line)) {
std::cout << line << std::endl; // on l'affiche
}
} else {
std::cout << "ERREUR: Impossible d'ouvrir le fichier." << std::endl;
}
}
int main(int argc, char * argv[]){
if(argc <3)
throw std::runtime_error("Usage: todo <instruction> <paramètres éventuels>!");
checkFirstArg(argv[1]);
auto instr = selectInstruction(argv[2]);
std::string const fileName("./todo.txt");
/* les énumération permettent l'utilisation de tests à choix multiples */
switch(instr){
case addToText:
/* on récupère les mots */
auto words = readSentence(argc, argv);
auto recup = createSentence(words);
add(fileName, recup);
break;
case ls :
less(fileName);
break;
case delFromText:
auto toDel = createSentence(readSentence(argc, argv));
del(fileName, toDel);
default:
assert(false, "you should never come here");
}
/* ... */
return 0;
} |
Partager