Se connecter / S'enregistrer
Votre question

fichiers et tableaux en C++

Tags :
  • string
  • Programmation
Dernière réponse : dans Programmation
7 Juin 2006 15:51:28

Bonjour,

j'ai un fichier texte (qui est une extraction de base de données) où chaque lignes est un enregistrement et où chaque champs est séparé par un point-virgule.

J'aimerai importer les données de ce fichiers dans un tableau à deux dimensions en C++ pour pouvoir appliquer des traitements sur les champs voulus.

Comment faire?

Autres pages sur : fichiers tableaux

7 Juin 2006 16:53:26

Salut,

Avec la std et en jouant avec les string y a pas de difficulté majeures, sauf que c'est un tableau a 3 dimensions qu'il te faut.

un truc du genre :

  1. #include<iostream>
  2. #include<fstream>
  3. #include<string>
  4.  
  5.  
  6. std::fstream fichier;
  7. std::string Ligne;
  8. int i = 0;
  9. int j;
  10.  
  11. fichier.open("nomdufichier", std::ios::in);
  12.  
  13. while(!fichier.eof())
  14. {
  15. std::getline(fichier, Ligne);
  16. i++;
  17. }
  18. fichier.close();
  19.  
  20. char ***Tab = new char**[i];
  21.  
  22. for (int j=0; j<i; j++)
  23. {
  24. Tab[j] = new char*[nombre de champs];
  25. }
  26.  
  27. std::string string1;
  28. fichier.open(...);
  29. while(!fichier.eof())
  30. {
  31. std::getline(fichier, Ligne);
  32.  
  33. while("; dans la ligne")
  34. {
  35. string1 = Ligne.substr("lechamps");
  36. tab[N°delaligne][N° du champs][0] = new char[string1.lenght+1];
  37. strcpy(&tab[ligne][champs][0], string1.c_str()););
  38. }
  39. }
  40.  
  41. fichier.close();



En gros si je me trompe pas ca doit donner quelques chose comme ca.
8 Juin 2006 10:56:04

Merci pour ton aide, mais vu mon niveau je cherche une solution super simple qui resterai en procédural si c'est possible, parce que sauf si je me trompe, tu me propose de l'objet... :-?
Contenus similaires
8 Juin 2006 18:12:58

Dans mon exemple ca reste procédural, meme si j'utilise la std du C++, y a pas de classe de créer.

8 Juin 2006 21:16:52

j'ai changer un peu mon algo et maintenant je récupère les lignes une à une par lecture séquentielle du fichier.

Une fois que j'ai une ligne dans ma variable, il faudrait que je la découpe en sous-chaine. Et la découpe se ferait par rapport aux point-virgule.

Donc normalment ça doit donner quelque chose de plus simple.

Si tu as la solution, n'hésite pas! ;-)
9 Juin 2006 08:55:15

  1. #include <string>
  2.  
  3.  
  4. std::string string1 = ligne;
  5. std::string string2;
  6.  
  7. while(string1.length()>0)
  8. {
  9. //mettre un champs dans string2
  10. string2 = string1.substr(0, string1.find(';'));
  11. string1 = string1.substr(string1.find(';')+1);
  12. }


En supposant que ta ligne finisse par un point virgule, si c'est pas le cas et que le nombre de champs est fixe faire un for(;;) a la place du while().
9 Juin 2006 11:25:09

ok merci, je vais essayer.
J'ai un autre problème... :-?

  1. //##########Bibliothèques##########
  2.  
  3. #include<iostream>
  4. #include<fstream>
  5. #include<io.h>
  6. #include<string>
  7.  
  8. using namespace std;
  9. //##########Types##########
  10.  
  11. typedef char chaine[300];
  12.  
  13. std::fstream fic;
  14.  
  15. chaine fclient;
  16.  
  17. //##########Programme principal##########
  18.  
  19. void main(void)
  20. {
  21.  
  22. chaine cli;
  23. int i;
  24. fic.open("fclient", ios::in);
  25. std::cout<<"Fichier ouvert";
  26. if(!fic.eof())
  27. {
  28. fic.read((char*)&cli, sizeof(chaine));
  29. std::cout<<"ligne extraite"<<"\n";
  30. std::cout<<cli;
  31. }
  32. else
  33. {
  34. std::cout<<"fichier vide";
  35. }
  36. std::cin>>i;
  37. }


Lorsque le contenu de cli s'affiche j'ai une double flèche verticale (une pointe vers le haut, l'autre vers le bas).

C'est quoi?

PS: Si je change la longueur de ma chaine, que je mette 1000 ou 10000, à la place de la double flèche j'ai 3 caractères du genre ùôµ.
9 Juin 2006 12:13:19

La chaine que tu lis ne correspond pas à une ligne (tu lis 300 caractères).
De plus ta lecture n'est pas zéro-terminé, donc le programme ne sait pas où ta chaîne s'arrête ...
De plus tu n'écris pas dans ton tableau de 300 caractères mais à une adresse incorrecte (il faut utiliser cli et non pas (char*)&cli) ...


Le plus simple c'est d'utiliser fic.getline(cli, sizeof(chaine));.
12 Juin 2006 08:18:20

J'ai essayé de mettre fic.getline(cli,sizeof(chaine)); à la place de fic.read((char*)&cli, sizeof(chaine)); mais le contenu de la variable cli ne s'affiche pas... pourtant il y a bien un std::cout<<cli;
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS