Tom's Guide > Forum > Programmation > fichiers et tableaux en C++
Mot :    Pseudo :           
 

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?

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

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 :

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




En gros si je me trompe pas ca doit donner quelques chose comme ca.

Répondre à Noxk

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... :-?

Répondre à defjamaica

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

Répondre à Noxk

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! ;-)

Répondre à defjamaica

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



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().

Répondre à Noxk

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

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



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 ùôµ.

Répondre à defjamaica

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));.

Répondre à chrisz

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;

Répondre à defjamaica
Tom's Guide > Forum > Programmation > fichiers et tableaux en C++
Aller à :

Il y a 279 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens