[C++] Recuperer des valeurs depuis un fichier

Recuperer des valeurs depuis un fichier [C++] - C++ - Programmation

Marsh Posté le 22-10-2001 à 16:16:10    

Alors voila le petit pb.
 
J'ai un fichier avec des valeurs separees par un ; et je voudrais recuperer ces valeurs dans un tableau.
Y a t il une fonction qui permette de faire ca ?
 
Merci ;)

Reply

Marsh Posté le 22-10-2001 à 16:16:10   

Reply

Marsh Posté le 22-10-2001 à 16:24:23    

C'est linéaire ? (je veux dire une seule ligne avec des valeurs numériques et des ;)  Pas de fin de ligne retour chariot ?

Reply

Marsh Posté le 22-10-2001 à 16:33:17    

ben je recupere la ligne avec un fgets.
Apres dans cette ligne j'ai les donnees avec des ;

Reply

Marsh Posté le 22-10-2001 à 18:00:14    

tu pourrais faire une boucle avec un sscanf(string, "%s;",buffer); puis tu reformat la string d'entrer pour virer ce que tu viens de récupérer jusqu'a ce qu'elle soit vide.
Enfin la c'est du C.

Reply

Marsh Posté le 22-10-2001 à 19:10:32    

ifstream file("cequetuveux.extension" );
 
while (!file.eof())
{
char buffer[300];
 
file >> buffer;
 
switch (buffer)
{
case ";":
fais rien;
break;
 
default:
mettre la valeur dans le tableau;
break;
}
}
 
Voilà, j'ai pas testé mais je ferais un truc comme ça.

Reply

Marsh Posté le 22-10-2001 à 20:51:48    

Impossible de faire un switch sur un char[300].
Putain ca commence a me faire chier ce putain de bordel, ca fait 2 jours que je suis dessus !!
 
Et pas moyen de faire un putain de strcmp(buffer[i], ";" ), il veut une adresse, mais l'adresse j'en ai rien a foutre !!!!
 
c'est vraiment de la merde ces fonctions (et je suis vraiment une bouse aussi !!!!)


---------------
Super.
Reply

Marsh Posté le 22-10-2001 à 21:20:00    

Et si tu utilisais un string?

Reply

Marsh Posté le 22-10-2001 à 21:30:43    

Godbout a écrit a écrit :

Impossible de faire un switch sur un char[300].  
Putain ca commence a me faire chier ce putain de bordel, ca fait 2 jours que je suis dessus !!  
 
Et pas moyen de faire un putain de strcmp(buffer[i], ";" ), il veut une adresse, mais l'adresse j'en ai rien a foutre !!!!  
 
c'est vraiment de la merde ces fonctions (et je suis vraiment une bouse aussi !!!!)  




 
Ben si il veut une adresse, met ton ';' dans une variable char et prend l'adresse de cette var dans ta fonction. Sinon fait une boucle en lisant caractère par caractère et stocke les dans une liste chainée tant que tu ne tombe pas sur un ';'. Et lorsque tu tombe sur un ';' tu termine la liste chainée par un '\0' et tu récupère ta chaine, et tu recommence ainsi de suite jusqu'à EOF.
C'est assez clair ?


---------------
-@- When code matters more than commercials -@-
Reply

Marsh Posté le 22-10-2001 à 22:01:49    

c'est pas le ";" qui gene, c'est buffer[i], il en veut pas, il veut &(buffer[i]), ce qui me sert strictement a rien du tout !!!
J'en ai ras le bol pour ce soir, je sens que je vais peter un cable.
Pour les listes chainees je vais voir ca demain, mais je sens que je vais encore m'arracher les cheveux.
Tout ca a finir pour vendredi, j'ai plus qu'a me tirer une balle !!
 
Putain faut que j'eclate quelque chose bordel !!!!!!
Le chat, il est ou...


---------------
Super.
Reply

Marsh Posté le 22-10-2001 à 22:18:08    

Alload a écrit a écrit :

ifstream file("cequetuveux.extension" );
 
while (!file.eof())
{
char buffer[300];
 
file >> buffer;
 
switch (buffer)
{
case ";":
fais rien;
break;
 
default:
mettre la valeur dans le tableau;
break;
}
}
 
Voilà, j'ai pas testé mais je ferais un truc comme ça.  




 
 
regarde e C ya une fction qui fait ca et te le met dans un tablo !!

Reply

Marsh Posté le 22-10-2001 à 22:18:08   

Reply

Marsh Posté le 22-10-2001 à 23:10:25    

c'est simplissime en c pur :
 
{
char   tab[200][100];
FILE * hnd = fopen("fic.txt","rt" );
int    i   = 0;  
 
do
{
  char buffer[300];
  if(fgets(buffer,299,hnd))
  {
    char * cour = buffer;
    char * prec = buffer;
 
    while (cour)
    {
       cour = strchr(prec, ';';);
       if(cour)
       {
         *cour = 0;
         cour++;
       }
       strcpy(&tab[i], prec);
       i++;
       prec = cour;
    }
}
while (!feof(hnd) && i<200 );
 
fclose(hnd);
}
 
bon, j'ai pas testé et pas deboggue (la biere doit pas aider des masses non plus) mais l'idee doit plus ou moins y etre  :D

Reply

Marsh Posté le 23-10-2001 à 02:39:14    

wpk a écrit a écrit :

 
    ...
    while (cour)
    ...




 
Je crois qu'il faut mettre  ... while (*cour) ...
 
A+

 

[edtdd]--Message édité par tfj57--[/edtdd]

Reply

Marsh Posté le 23-10-2001 à 09:01:39    

wpk a écrit a écrit :

bon, j'ai pas testé et pas deboggue (la biere doit pas aider des masses non plus) mais l'idee doit plus ou moins y etre  :D  




une despé et il est paf :D :D

Reply

Marsh Posté le 23-10-2001 à 09:10:57    

j'suis sur le cul...
 
faudra que je me remette a niveau :(

Reply

Marsh Posté le 23-10-2001 à 09:39:08    

perso je dirais qu'il faut utiliser strtok, qui decoupe une chaine de caractères en plusieurs séparé par une valeur (par exemple ; dans ton cas)
 
voila voila

Reply

Marsh Posté le 23-10-2001 à 10:05:42    

ok
l'histoire des pointeurs est vraiment pas mal, surtout qu'il faut que je m'y remette grave, parce que c'etait pas si complique que ca.
Mais avec les pointeurs j'ai trop de mal, surtout pour les chaines de caracteres.

Reply

Marsh Posté le 23-10-2001 à 10:42:29    

Heu tu peux aussi utiliser la fonction strtok de la bibliothéque C string.h qui doit de te permettre simplement de récupérer tes données (si c du numéric combine avec atoi ou atof de stdlib.h)

Reply

Marsh Posté le 23-10-2001 à 11:14:35    

pour les donnees en fait c'est bon (apparemment).
J'ai fait des strncat et strncopy, comme ca je donne l'adresse mais je recupere que la premiere valeur et pas tout le bordel qu'il y a derriere.
 
Merci ;)

Reply

Marsh Posté le 23-10-2001 à 14:27:32    

Un bout de code qui "émule" strtok (testé)
char *Chaine;
char *ptr;
int iC, ind, NbCar, Tabl[250];
int ValNum (ou float);
 
// lecture de la chaine à partir du fichier
//......
 
// décodage
 
ptr = Chaine;
ind = 0;
NbCar = strlen(Chaine); //<= en dehors de la boucle ! Sinon strlen() varie !!
 
for (iC = 0; iC < NbCar; ++ iC)
{
  if (Chaine[iC] == ';';)
  {
    // met caract à zéro pour lire direct
    Chaine[iC] = '\0';
    ValNum = atoi(ptr); // ou atoi(ptr);
    Tabl[ind] = ValNum;
    ++ ind;
    // nouveau début de chaîne "nombre"
    ptr = (Chaine + iC + 1);
  }
}
// voir le traitement de la fin si y a pas de ';' au bout

Reply

Marsh Posté le 23-10-2001 à 14:54:08    

une classe stringtokenizer que j'avais ecrite vite fait puis laisser tomber...
le .h :

Code :
  1. #ifndef _stringtokenizer_h
  2. #define _stringtokenizer_h
  3. //----Include manip fichiers------------------------------------
  4. #pragma warning (disable : 4786)
  5. #include <string>   // std::string
  6. #include <vector>   // std::vector
  7. //----Classe StringTokenizer------------------------------------
  8. class StringTokenizer
  9. {
  10. public:
  11. StringTokenizer (std::string str);
  12. StringTokenizer (std::string str,std::string delim);
  13.    
  14. virtual ~StringTokenizer ();
  15. int countTokens ();
  16. bool hasMoreTokens ();
  17. std::string nextToken ();
  18. private:
  19. std::string _string;
  20. std::string _delim;
  21. std::vector<std::string> _tokens;
  22. int _it;
  23. void tokenize (std::string str, std::string delim);
  24. };
  25. #endif


 
le .cpp:

Code :
  1. #include "StringTokenizer.h"
  2. //----StringTokenizer (str)--------------------------------------
  3. StringTokenizer::StringTokenizer (std::string str)
  4. {
  5. tokenize (str, " " );
  6. }
  7. //----StringTokenizer (str, delim)-------------------------------
  8. StringTokenizer::StringTokenizer (std::string str, std::string delim)
  9. {
  10. tokenize (str, delim);
  11. }
  12. //----StringTokenizer::tokenize (str, delim)---------------------
  13. void StringTokenizer::tokenize (std::string str, std::string delim)
  14. {
  15. int delimPos = 0;
  16. _string = str;
  17. _delim  = delim;
  18. while ((delimPos = _string.find (_delim)) != _string.npos)
  19. {
  20.  std::string newToken = _string.substr (0, delimPos);
  21.  _tokens.push_back (newToken);
  22.  _string = _string.substr (delimPos + _delim.size (), _string.size ());
  23. }
  24. _tokens.push_back (_string);
  25. _string = str;
  26. }
  27. //----StringTokenizer::~StringTokenizer-----------
  28. ---------------
  29. StringTokenizer::~StringTokenizer ()
  30. {
  31. _tokens.clear ();
  32. }
  33. //----StringTokenizer::countTokens-------------------------------
  34. int StringTokenizer::countTokens ()
  35. {
  36. return _tokens.size();
  37. }
  38. //----StringTokenizer::hasMoreTokens-----------------------------
  39. bool StringTokenizer::hasMoreTokens ()
  40. {
  41. if (_it < _tokens.size ())
  42. {
  43.  return true;
  44. }
  45. return false;
  46. }
  47. //----StringTokenizer::nextToken---------------------------------
  48. std::string StringTokenizer::nextToken ()
  49. {
  50. if (hasMoreTokens ())
  51. {
  52.  return _tokens[_it++];
  53. }
  54. return 0;
  55. }


 
a modifier et ameliorer... :D

Reply

Marsh Posté le 23-10-2001 à 15:07:27    

very trop compliqued for me :D

Reply

Marsh Posté le 24-10-2001 à 01:42:44    

__Lolo__ a écrit a écrit :

 
une despé et il est paf :D :D  




 
pfff  :non: , j'avais la creve, et la despe c'etait juste au resto, j'en ai ingurgité une autre chez moi... et j'etais pas fait, la preuve, le code marchouille apparament  :sol:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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