aide écriture code c++ recherche et cumul de nombres

aide écriture code c++ recherche et cumul de nombres - C++ - Programmation

Marsh Posté le 09-12-2020 à 13:15:55    

bonjour à tous.
j'avais commencé à apprendre les bases du C++ mais vite arrêté par manque de temps...
 
aujourd'hui j'aimerais écrire un petit programme qui :
 
ouvre et lit un "fichier.txt" (~2000 lignes), et fait le cumul des nombres qui se trouvent juste avant chaque caractère "€".
 
 
j'ai comme base un bout de code qui fait un cumul, mais le fichier ne doit contenir que des chiffres tel 0 2 5 8 etc...
c'est à améliorer... :
 

Code :
  1. #include <fstream> // pour ifstream ( flux fichier)
  2. #include <iostream> // pour cin et cout
  3. #define NOM_FICHIER "liste.txt"
  4. using namespace std; // déclaration espace de nom STL par défaut (éviter la résolution de nom d'espace std:: à chaque fois)
  5. int main(int argc, char *argv[])
  6. {
  7. int Cumul; // cumul des chiffres
  8. int Num; // chiffre individuel à lire
  9. ifstream Fichier; // objet Fichier à lire
  10. Fichier.open(NOM_FICHIER); // ouvrir le flux E/S (Fichier)
  11. if (!Fichier) { // si le fichier est ouvert correctement
  12.     cout << "Opps! erreur d'ouverture du fichier :" << NOM_FICHIER << endl; // informe d'une erreur
  13.  cout << "Presser une touche pour terminer...";
  14.  cin.get(); // attend une entrée clavier
  15.     return 1; // sortie signalant un échec  
  16. }
  17. Cumul = 0; // initialise le cumul  
  18. while (Fichier >> Num) // lire tant qu'il y a des chiffres à lire
  19.  Cumul += Num; // ajoute le chiffre lu au cumul
  20. Fichier.close(); // fermer le flux E/S (Fichier)
  21. cout << "Cumul = " << Cumul << endl; // aficher le cumul et un CR/LF
  22. cout << "Presser une touche pour terminer...";
  23. cin.get(); // attend une entrée clavier
  24. return 0;
  25. }


 
si quelqu’un pouvait m'aider...,
j'ai clairement des lacunes en C++, mais j'ai je voudrais m'améliorer.
(au passage, si vous connaissez un bon site pour apprendre de bonnes bases).
 
merci.  :hello:


Message édité par redscreen le 10-12-2020 à 13:01:08
Reply

Marsh Posté le 09-12-2020 à 13:15:55   

Reply

Marsh Posté le 10-12-2020 à 12:52:13    

Bon bien je fais question et réponse...
 
Ma "liste.txt" a comme format :
 
blabla blablabla ->15€
blabla 2 blablabla ->11€
blablablablabla ->3€
etc...
 
et voici mon code :
 

Code :
  1. #include <iostream> // pour cin et cout
  2. #include <string>
  3. #include <cstring> // ancienne bibliothèque utilisée en C
  4. #include <fstream> // pour ifstream (flux fichier)
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. using namespace std;
  8. int main()
  9. {
  10. char a[255], separator[] = ">", chiffre[] = "0123456789", *p;
  11. int somme = 0;
  12. fstream f("liste.txt", ios::in);
  13. if (!f) {
  14.  cout << "Erreur d'ouverture du fichier!" << endl;
  15.  return 1;
  16. }
  17. while (!f.eof()) {
  18.  f.getline(a, 255, '\n');
  19.  p = strtok(a, separator); // sépare la chaine avec ">"
  20.  while (p) {
  21.   if (strspn(p, chiffre) == strlen(p))
  22.    somme += atoi(p);
  23.   cout << p << "\n";
  24.   p = strtok(NULL, separator);
  25.  }
  26. }
  27. cout << "Total = " << somme << " euros" << endl;
  28. return 0;
  29. }


 
J'aimerais pouvoir "spliter" sur le caractère €, mais il est non reconnu..., comment faire ?
(Pour que ça fonctionne, pour le moment je dois supprimer tous les signes "€" de ma "liste.txt" )
 
Je transforme donc ma question en :
 
Comment reconnaitre le caractère " € " dans une chaine de caractères en C++ ?


Message édité par redscreen le 10-12-2020 à 13:02:02
Reply

Marsh Posté le 10-12-2020 à 20:55:10    

Le signe '€' n'est pas du ASCII, il doit être encodé en UTF-8 ou autre. Je ne parle pas C++, mais tu devrais trouver sur internet comment faire avec ces mots-clé, genre "read UTF-8 file C++".
 
Sinon pour ton code attention aux "nombres magiques", tu devrais utiliser un #define ou une constante pour le 255 histoire de ne pas avoir à changer la valeur à plusieurs endroits si il faut.

Reply

Marsh Posté le 11-12-2020 à 12:03:57    

merci pour ta réponse
oui j'ai vu que ce n'était pas de l'ASCII, (l'ASCII est plus ancien que l'euro...), et du coup j'avais essayé de convertir mon txt en UTF8, mais rien de mieux...
bonne remarque pour le 255, habitude à prendre. (pour ce petit programme ça fera l'affaire).
j'ai réussi à faire exactement ce que je voulais avec NodeJs, mais en C++ j'ai toujours du mal.
je vais relire quelques cours... et si un pro C++ passe par là... :jap:  

Reply

Marsh Posté le 21-05-2021 à 00:17:41    

Bonjour,
comme le nombre de données est important,
utilises la ressource "expressions régulières",
c'est comme if ( la chaine == nombre + caractere euro ).
les expressions régulières permettent de définir un schèma.
de l'utiliser comme 'critère de recherche' dans un ensemble + grand.
 
et aussi de récupérer toutes les occurences 'trouvées' de ton schèma,
dans un tableau de 'output'.
C'est le plus pratique sur des échantillons de données important...
 
pour tester si une chaine est 'numerique' , il y a des fonctions natives qui sont simples.
Mais pour des fichiers de données, sans en connaitre d'avance le nombre, et la taille des fichiers , les expressions régulières font ça trés bien.
C'est dédié à cet usage. Imbattable pour ce type de recherche.
et pour ton schèma : tu es sur ( { des chiffres ... } puis le symbole 'currency' ) .
 
 
Attention au références sur Internet , car toutes regExp sont en 'variantes' selon le langage concerné.
Les syntaxes sont parfois différentes.
c'est vraiment "C++ regexp " qui convient.
 
 
 


---------------
Nom : Prénom : Age : Adresse : Ville : Code Postal : Num Trois Tel
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed