comment se positionner au début d'un fichier ?

comment se positionner au début d'un fichier ? - C++ - Programmation

Marsh Posté le 02-01-2003 à 17:36:22    

une fois qu'on est arrivé a la fin d'un fichier comment on fait pour se positionner au début ?

Reply

Marsh Posté le 02-01-2003 à 17:36:22   

Reply

Marsh Posté le 02-01-2003 à 17:54:20    

fseek(file,0,SEEK_SET);

Reply

Marsh Posté le 02-01-2003 à 17:58:15    

et en C++
 
my_input_stream.seekg(0, ios::beg) qui est la meme chose que my_input_stream.seekg(0, ios_base::beg)


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 02-01-2003 à 18:01:14    

Taz@PPC a écrit :

et en C++
 
my_input_stream.seekg(0, ios::beg) qui est la meme chose que my_input_stream.seekg(0, ios_base::beg)


 
je ne dirais pas ce que l'on trouve dans mon code c++[:titprem]

Reply

Marsh Posté le 02-01-2003 à 18:04:56    

des truc qui commence par f/F  :whistle:  :D


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 02-01-2003 à 18:06:55    

j'avoue [:ddr555]
 
(bon, a moitié en fait, vu que j'ai une tite couche par dessus)

Reply

Marsh Posté le 02-01-2003 à 22:28:16    

j'ai essayé fseek mais ça me met un message d'erreur !
voilà le code au cas où.
 
 

Code :
  1. #include <stdio.h>
  2.    #include <iostream.h>
  3.    #include <string.h>
  4.    #include <conio.h>
  5.    #define nb_vertices 200000
  6. #define nb_faces 200000
  7. float tab_vertices [nb_vertices][3] ;
  8. int tab_sommets [nb_faces][3] ;
  9.     void lecture ()
  10.     {
  11. char tmp [100] ;
  12. char tmp2 [100] ;
  13. int temp [nb_vertices] ;
  14. char chaine [100] ;
  15. char chaine2 [100] ;
  16.    strcpy (chaine , "*MESH_VERTEX" ) ; //affecte la chaine "*MESH_VERTEX" au tableau chaine
  17. strcpy (chaine2 , "*MESH_FACE" ) ;
  18. //char passe_ligne [200] ;
  19. int i=0 ;
  20.    int k=0;
  21. char nom_fichier[] = "cool.ase" ;
  22. FILE *cool ;    //pointeur sur le fichier cool
  23. if ((cool = fopen(nom_fichier, "r" )) == NULL)
  24.          return ;
  25. do
  26. {
  27.  do
  28.   {
  29.   fscanf(cool, "%s", tmp) ;
  30.   }
  31.   while (strcmp (chaine, tmp) != 0) ; //passe toutes les chaines en revue qu'a ce que tmp soit égal à chaine ("*MESH_VERTEX" )
  32.   do//rempli le tableau avec des coordonnées de vertices
  33.  {
  34.   fscanf (cool, "%d%f%f%f%s", &(temp[0]) , &(tab_vertices[i][0]), &(tab_vertices[i][1]),
  35.          &(tab_vertices[i][2]), tmp) ;
  36.   //cout << tab_vertices[i][0]<<" "<< tab_vertices[i][1]<<" "<< tab_vertices[i][2]<<endl ;
  37.          i=i+1 ;
  38.  }
  39.  while (strcmp (tmp, "}" )!=0) ;
  40. }
  41.    while (!feof(cool)) ;
  42.         fseek (cool, 0, SEEK_SET) ;
  43. do
  44. {
  45.  do //rempli le tableau avec le numero des sommets
  46.  {
  47.   do
  48.    {
  49.    fscanf(cool, "%s", tmp2) ;
  50.   }
  51.    while (strcmp (chaine2, tmp2) != 0) ;
  52.   //fgets (passe_ligne, 200, cool) ; //saute une ligne dans le fichier où les données ne servent pas
  53.   fscanf (cool, "%s %s    %d %s    %d %s   %d %s    %d %s    %d %s    %d  %s %d  %s %d",
  54.           tmp, tmp, &tab_sommets [k][0],tmp,&tab_sommets [k][1],tmp, &tab_sommets [k][2], tmp,
  55.    &temp[0],tmp, &temp[0],tmp, &temp[0],tmp, &temp[0],tmp, &temp[0]) ;
  56.   cout << tab_sommets [k][0]<<" "<<tab_sommets [k][1]<<" "<<tab_sommets [k][2] << endl ;
  57.          k=k+1  ;
  58.  }
  59.       while (strcmp (tmp2, "}" )!=0);
  60. }
  61. while (!feof(cool)) ;
  62.    
  63.      fclose (cool) ;
  64.    }
  65.    void main ()
  66.    {
  67.     lecture () ;
  68.   getch ();
  69.    }


Message édité par airseb le 03-01-2003 à 14:52:57
Reply

Marsh Posté le 02-01-2003 à 22:43:11    

on va dire que j'ai rien vu...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
quoi comme message d'erreur? à la compilation?


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 02-01-2003 à 23:07:38    

ça compile mais j'ai un "debug error" au moment où la fenetre doit s'afficher.
 

Reply

Marsh Posté le 02-01-2003 à 23:27:20    

airseb a écrit :

ça compile mais j'ai un "debug error" au moment où la fenetre doit s'afficher.
 
 

euh tu me provoques la ou quoi :D ?


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 02-01-2003 à 23:27:20   

Reply

Marsh Posté le 02-01-2003 à 23:29:53    

airseb a écrit :

ça compile mais j'ai un "debug error" au moment où la fenetre doit s'afficher.
 
 


 
bordel, c'est vraiment TROP te demander de POSTER ce ***** DE MESSAGE D'ERREUR ?  

Reply

Marsh Posté le 02-01-2003 à 23:36:06    

c un efenetre qui apparait avec marque dessus :
"debug error
 
chemin du fichier
 
runtime error"
 
avec les boutons abandonner, recommencer, ignorer.
 
c tout !

Reply

Marsh Posté le 02-01-2003 à 23:41:24    

airseb a écrit :

c un efenetre qui apparait avec marque dessus :
"debug error
 
chemin du fichier
 
runtime error"
 
avec les boutons abandonner, recommencer, ignorer.
 
c tout !

mince alors  :pfff:


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 03-01-2003 à 11:29:27    

Un petit conseil
Je serai toi j'initialiserai tous mes tableau avec Memset dés le debut.
c preferable et ca evite des soucis parfois.

Reply

Marsh Posté le 03-01-2003 à 12:13:53    

acidman a écrit :

Un petit conseil
Je serai toi j'initialiserai tous mes tableau avec Memset dés le debut.
c preferable et ca evite des soucis parfois.

:pfff: toi tu sors
 
 
c'est vrai que tu ferais peut etre mieux d'utiliser des std::vector et des std::string et profiter de leur constructeur qui forunissent une initiliasitation par défaut
 
mais t'en va surtout pas faire du malloc/memset. si tu utilises malloc (c'est a dire que tu dissocies allocation et construction), jete un oeil à uninitialized_fill/copy, etc.


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 03-01-2003 à 13:14:33    

Taz@PPC a écrit :

:pfff: toi tu sors
 
 
c'est vrai que tu ferais peut etre mieux d'utiliser des std::vector et des std::string et profiter de leur constructeur qui forunissent une initiliasitation par défaut
 
mais t'en va surtout pas faire du malloc/memset. si tu utilises malloc (c'est a dire que tu dissocies allocation et construction), jete un oeil à uninitialized_fill/copy, etc.


 
Faut pas s'enerver comme ca  
c'est un conseil car il faut prendre l'habitude d'initialisez les tableau c tout
Maintenant explique moi en quoi le memset n'est pas bon a utilisé?

Reply

Marsh Posté le 03-01-2003 à 13:28:55    

parce que c'est du C pardi
 
en C++ on initialise pas, on construit. les constructeurs par déaut des types de bases sont triviaux et on peut éventuellement obtenir le meme résultat avec qu'avec une construction/affectation.
 
les fonctions meme* sont certes tres utilses en C mais ne servent à rien en C++. Bref, utilisez les std::vector qui construit proprement chaque élément de la séquence.
 
le code de airseb est du pur C: c'est bien simple chez moi, ça compile en C (sauf le iostream.h qui est inutile dans tous les cas) mais pas en C++.
 
d'ailleurs pourquoi je parle de C++
 
vas pour le memset alors, mais seulement sur des tableaux d'entier (pas de char (0 par imprimble), pas de flottant (0 est une représentation invalide qui peut déclencher des SIGFPE)
donc moi je n'utilise memset que pour intialiser des entiers et nettoyer proprement des zones avant des les exploiter


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 03-01-2003 à 14:59:03    

j'ai fais un petit test :
quand j'enleve les commentaires devant le 1er cout, la partie avant le fseek s'execute,mais pas la seconde comme si le fseek n'avait aucun effet
Et quand je met en commentaire toute la première partie avant le fseek( du "do" jusqu'au "while(!feof)" la 2ème marche parfaitement.
ce qui veut dire que le probleme est au nivo du fseek qui semble ne pas faire son effet, pouvez vous me dire pourquoi ?

Reply

Marsh Posté le 03-01-2003 à 21:38:41    

Citation :

vas pour le memset alors, mais seulement sur des tableaux d'entier (pas de char (0 par imprimble), pas de flottant (0 est une représentation invalide qui peut déclencher des SIGFPE)
donc moi je n'utilise memset que pour intialiser des entiers et nettoyer proprement des zones avant des les exploiter


 
l'equivalent en C++
c'est std::fill
 
Par contre il existe des methodes rapides de copies
de blocs ou de remplissages de blocs avec MMX
qui ne peuvent pas etre compatibles avec les specifications du C++.
Tout depend de tes priorites.
 
LeGreg


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 04-01-2003 à 04:28:26    

Il me semble que fseek ne remet pas à 0 les indicateur d'erreur et eof: echec pour toute lecture/feof ultérieurs.
 
Essaie:

Code :
  1. rewind(cool);


 
 

acidman a écrit :

c'est un conseil car il faut prendre l'habitude d'initialisez les tableau c tout

Je suis contre.
J'initialise que si j'en ai explicitement besoin.
En effet, le compilateur considère comme normal l'accès à une valeur initialisée, donc on perd une alerte potentielle.
 
Pour les initialisations nécessaires j'utilises '={};' (pour les tableaux vrais), comme ça le compilateur comprends.
Pour les initialisations de déboguage (repérer à coup sûr des valeurs bidon 'non-initialisées';), j'utilises des macros debug-only.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 04-01-2003 à 12:37:57    

koi comme macros debug que tu utilise le plus svt
cite moi juste 2-3  pour que je m'y mette un peu qd meme

Reply

Marsh Posté le 05-01-2003 à 06:32:13    

Dans ce genre:

Code :
  1. //remplir tout objet (variable/structure/tableau) d'octets val
  2. #define BYTEFILL(obj,val) do{ memset(&(obj),val,sizeof(obj)); } while(0)
  3. //remplir tout objet d'octets à 0 (ce qui n'est pas forcément valeur 0)
  4. #ifdef NDEBUG
  5. #define DBGZERO(a) do{} while(0)
  6. #else
  7. #define DBGZERO(a) BYTEFILL(a,0)
  8. #endif
  9. //remplir tout objet d'octets à une valeur bogus magique
  10. #ifdef NDEBUG
  11. #define DBGBOGUS(a) do{} while(0)
  12. #else
  13. #define DBGBOGUS(a) BYTEFILL(a,0xCC)
  14. #endif
  15. //free() un pointeur et lui donne une valeur bogus pour éviter le réemploi
  16. #ifdef NDEBUG
  17. #define FREEZAP(p) do{ free(p)                 ; } while(0)
  18. #else
  19. #define FREEZAP(p) do{ free(p); p= 0x0xDeadC0de; } while(0)
  20. #endif

Je ne suis pas satisfait des noms. J'en cherche qui soient courts, explictes et cohérents.
 
'do{...} while(0)' est une astuce pour:
1) Obliger à placer un ';' après, comme pour une instruction.
2) Garantir que ce ';' est mangé et ne vas pas briser un if/else.
 
En C++ c'est un peu différent.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 05-01-2003 à 10:35:44    

je croyais que t'avais dit que t'arreter les macros pour 2003  :whistle:

Reply

Marsh Posté le 05-01-2003 à 16:09:19    

bon, puisque finalement vous voulez faire du C, je vous donne la solution.
 
Lorsque EOF est détecté, le flag d'erreur du flux est mis a jour. toute opération sur le flux est donc rendu impossible. la solution?  raz le flag
 
void clearerr(FILE * stream);
 
et apres
 
void rewind(FILE * stream);
(qui est equivalent à fseek(stream, OL, SEEK_SET))
 
tout ça bien évidemment dans <stdio.h>

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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