Vecteur dans fichier

Vecteur dans fichier - C - Programmation

Marsh Posté le 29-03-2008 à 02:32:01    

Bonjour tout le monde,  
 
Je me demandais, comment fait on pour enregistrer un vecteur dans un fichier ??
 
Devons nous d'abord utiliser une boucle pour creer ce vecteur qui contiendra des nombre trier par ordre croissant.
Puis une deuxieme boucle qui enregistrera chaque element du vecteur dans le fichier ?
 
OU
 
Trier donc le vecteur et dés qu'un element est positionner l'enregistrer dans le fichier ?
 
Aidez moi parce que la je vois pas comment faire.
 
Merci d'avance et a tres bientot.

Reply

Marsh Posté le 29-03-2008 à 02:32:01   

Reply

Marsh Posté le 29-03-2008 à 09:25:02    

Si ton but c'est juste d'enregistrer un vecteur dans un fichier, je vois pas ce que le tri vient faire dans l'histoire.

Reply

Marsh Posté le 29-03-2008 à 13:26:36    

std::copy + stream_iterator
 

Code :
  1. #include <vector>
  2. #include <iostream>
  3. #include <ostream>
  4. #include <algorithm>
  5. #include <iterator>
  6. #include <string>
  7. template<typename Iterator>
  8. void dump(Iterator begin, Iterator end, std::ostream& out, const std::string& separator = "|" )
  9. {
  10.   std::copy(begin, end, std::ostream_iterator<typename Iterator::value_type>(out, separator.c_str()));
  11. }
  12. int main()
  13. {
  14.   std::vector<int> ints;
  15.   ints.push_back(7);
  16.   ints.push_back(7);
  17.   ints.push_back(82);
  18.   dump(ints.begin(), ints.end(), std::cout);
  19. }


 
Digère ça et interdiction de demander comment on fait pour lire avant d'avoir lu la documentation relative à tout ça.

Reply

Marsh Posté le 29-03-2008 à 19:38:26    

oui mais ca c'est du C++  :o

Reply

Marsh Posté le 29-03-2008 à 23:57:14    

ben en fait je dois enregistrer dans un fichier un vecteur dont les nombre sont trié. Pour le moment j'utilise une fonction ki trié par ordre croissant les enregistrement qui sont dans un autre fichier sur le numero du produit.
 
Une fois fait mon vecteur contient les numero de produit trie par ordre croissant. Seulement ce vecteur je dois l'enregistrer dans un fichier mais je sais pas comment faire...
 
Aidez moi svp.
 

Reply

Marsh Posté le 30-03-2008 à 05:04:43    

C'est quoi un vecteur pour toi?
C'est du C ou du C++?
Tu sais lire un fichier mais pas écrire dedans? (indice lire en anglais se dit read et ecrire write)
Si c'est du C++ t'as la réponse de Taz.
Si c'est du C, montre nous où t'en es au lieu de demander une solution toute faite.
Taz, je voulais faire un bô lien vers ton topic [BIBLIOLINK C] mais pas mal de liens sont morts il me semble:
http://forum.hardware.fr/hfr/Progr [...] 9954_1.htm

 

j'ajouterais qu'une simple recherche google: "langage C ecrire fichier" te donne absolument toutes les réponses et même des tuto dans les premiers liens (chez moi le deuxieme lien récapitule toutes les fonctions).

Message cité 1 fois
Message édité par ptitchep le 30-03-2008 à 05:19:33

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 30-03-2008 à 10:47:55    

ptitchep a écrit :


j'ajouterais qu'une simple recherche google: "langage C ecrire fichier" te donne absolument toutes les réponses et même des tuto dans les premiers liens (chez moi le deuxieme lien récapitule toutes les fonctions).


 
Sauf que 85654% de ces sites utilisent la méthode feof qui est débile v_v.
 

Reply

Marsh Posté le 30-03-2008 à 13:04:45    

(oops)
 
Trop de cours de C sont écrits par des gens qui enseignaient encore le Pascal y a 5 ans, alors l'erreur du feof, ils ne la verront jamais.

Reply

Marsh Posté le 30-03-2008 à 16:31:24    

je veux pas que vous me donnier du code je voudrais simplement savoir si il est possible d'enregistrer un veteur dans un fichier...
Si oui comment, si non faut il enregistrer les terme du vecteur un a un.
 
Merci

Reply

Marsh Posté le 30-03-2008 à 17:06:12    

pepito17 a écrit :

je veux pas que vous me donnier du code je voudrais simplement savoir si il est possible d'enregistrer un veteur dans un fichier...
Si oui comment, si non faut il enregistrer les terme du vecteur un a un.
 
Merci


Oui, il est possible d'enregistrer un vecteur dans un fichier. On peut enregistrer à peu près ce qu'on veut dans un fichier d'ailleurs.
 
Comment ? En utilisant les fonctions de manipulation d'un fichier : fprintf (en mode texte), ou fwrite (en mode binaire).
 
Voici un exemple de code permettant d'enregistrer un vecteur (représenté sous forme d'une structure) dans un fichier texte.
 

Code :
  1. #include <stdio.h>
  2. struct vecteur{
  3.     int x;
  4.     int y;
  5.     int z;
  6. }
  7. typedef struct vecteur s_vecteur;
  8. int main() {
  9.     s_vecteur unvecteur;
  10.     unvecteur.x = 1;
  11.     unvecteur.y = 2;   
  12.     unvecteur.z = 3;
  13.     FILE *f;
  14.     f = fopen("vecteur.txt","wt" );
  15.     if (f != NULL) {
  16.         fprintf(f,"%d %d %d\n",unvecteur.x, unvecteur.y,unvecteur.z);
  17.        fclose(f);
  18.     }
  19.     else {   
  20.         /* erreur ouverture fichier */
  21.     }
  22.     return 0;
  23. }

Reply

Marsh Posté le 30-03-2008 à 17:06:12   

Reply

Marsh Posté le 30-03-2008 à 18:37:42    

Joel F a écrit :

 

Sauf que 85654% de ces sites utilisent la méthode feof qui est débile v_v.

 



Oui mais au moins il aurait quelque chose à montrer et là tu lui expliquerais pour le feof.

 


edit: du coup j'ai lu le site dont je parle il propose ça en exemple:

 
Code :
  1. int main(int argc,char *argv[])
  2. {
  3.   int source, destination;
  4.   char buffer[taillebloc];
  5.   int nb_lus,nb_ecrits;
  6.   if (argc!=3) {puts("erreur arguments" );return(1);}
  7.   if((source=open(argv[1],O_RDONLY|O_BINARY))<0)
  8.    {puts("erreur ouverture" );return(2);}
  9.   if((destination=open(argv[2], O_WRONLY| O_CREAT| O_TRUNC| O_BINARY,
  10.     S_IREAD| S_IWRITE| S_IEXEC))<0)
  11.          {puts("erreur ouverture" );return(2);}
  12.   do
  13.    {
  14.     nb_lus=read(source,(char *)buffer,taillebloc);
  15.     if (nb_lus>0) nb_ecrits= write(destination,(char*)buffer, nb_lus);
  16.    }
  17.   while ((nb_lus==taillebloc)&&(nb_ecrits>0));
  18.   close(source);
  19.   close(destination);
  20.   return(0);
  21. }


Les fonctions fopen, fread,... sont décrites en dessous mais pas d'exemple. On suppose quand même qu'il ne faut pas utiliser feof, il n'utilise pas d'eof dans l'exemple précédent...

Message cité 1 fois
Message édité par ptitchep le 30-03-2008 à 19:01:36

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 30-03-2008 à 18:57:32    

Merci pour cette reponse xilebo mais comme je pourrai faire avec du binaire ? parce que si je fait comme toi ca l'enregistrera en texte moi il le faut en binaire...  
 
Merci pour ton aide

Reply

Marsh Posté le 30-03-2008 à 19:04:34    

Reply

Marsh Posté le 30-03-2008 à 19:12:49    

pepito17 a écrit :

Merci pour cette reponse xilebo mais comme je pourrai faire avec du binaire ? parce que si je fait comme toi ca l'enregistrera en texte moi il le faut en binaire...  
 
Merci pour ton aide


 
Ben tu sors tes petits doigts muscles et tu regardes la documentation de fwrite. :o
 
Un autre lien interessant : http://mapage.noos.fr/emdel/notes.htm#fichiers

Reply

Marsh Posté le 30-03-2008 à 19:27:49    

ptitchep a écrit :


edit: du coup j'ai lu le site dont je parle il propose ça en exemple:

 

open,read & co .. non mais c'est quoi ce bordel. Pourquoi pas les commandes systemes en asm tant qu'on y est :[


Message édité par Joel F le 30-03-2008 à 19:28:16
Reply

Marsh Posté le 30-03-2008 à 19:44:34    

ptitchep a écrit : a écrit :


Les fonctions fopen, fread,... sont décrites en dessous mais pas d'exemple.



 

Ben ça récapitule tout, et le même exemple avec fopen au lieu de open, ca ne change en rien la logique... Mais bon c'est vrai que l'inverse serait plus pratique (exemple ac fopen et juste description des fonctions open,...)

 

Et puis à la base je voulais juste lui dire qu'avec google et un peu de courage sa question serait passée de :
Comment fait on pour...
à
Je n'ai pas compris le fonctionnement de ... quand je fais

Code :
  1. ...

j'ai tel problème.

 


Message édité par ptitchep le 30-03-2008 à 19:54:34

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 30-03-2008 à 21:03:15    

pepito17 a écrit :

Merci pour cette reponse xilebo mais comme je pourrai faire avec du binaire ? parce que si je fait comme toi ca l'enregistrera en texte moi il le faut en binaire...  
 
Merci pour ton aide


Comme on te l'a expliqué ci-dessus, le mieux est que tu regardes la documentation des fonctions. Ce sont des fonctions standard, tu la trouveras à peu près n'importe où (man "fonction" sous un linuxoide, ou sous google).
 
 
Pour écrire des données binaires dans un fichier, il faut utiliser la fonction fwrite, qui accepte en paramètre une adresse ainsi qu'une taille.
 
 
Voici un exemple de code avec fwrite :  
 

Code :
  1. #include <stdio.h>
  2. struct vecteur{
  3.     int x;
  4.     int y;
  5.     int z;
  6. };
  7. typedef struct vecteur s_vecteur;
  8. int main() {
  9.     s_vecteur unvecteur;
  10.     unvecteur.x = 1;
  11.     unvecteur.y = 2; 
  12.     unvecteur.z = 3;
  13.     FILE *f;
  14.     f = fopen("vecteur.dat","wb";);
  15.     if (f != NULL) {
  16.        fwrite(&unvecteur,sizeof unvecteur,1,f);
  17.        fclose(f);
  18.     }
  19.     else
  20.        /* erreur ouverture fichier */
  21.     }
  22.     return 0;
  23. }


Message édité par xilebo le 30-03-2008 à 21:14:05
Reply

Marsh Posté le 30-03-2008 à 22:00:34    

oui ca je sais comment utiliser la fonction fwrite, ... Mais je ne sais pas quel est la taille de mon vecteur.
 
J'ai mon vecteur NumProd qui se compose ainsi :
NumProd[0]=1
NumProd[1]=12
NumProd[2]=54
 
Mais je ne connais pas la taille de l'espace disponible pour un temre en n position. Sans connaitre la taille on ne sais pas utiliser fwrite et donc c'est ca mon probleme... Comment puis je faire ?
 
Merci

Reply

Marsh Posté le 30-03-2008 à 22:04:54    

sizeof

 

edit : ou alors j'ai pas compris la question [:dawa]


Message édité par Elmoricq le 30-03-2008 à 22:05:33
Reply

Marsh Posté le 30-03-2008 à 22:07:28    

J'avoue que j'ai pas bien compris ta derniere phrase.
normalement tu crées ton tableau (tu connais donc sa taille), tu y ajoutes les éléments (tu en connais le nombre <= taille) tu le tries (si tu veux) et ensuite tu l'écris dans le fichier:
 
fwrite (NumProd, sizeof(int), nbElements, fichier); //si tes éléments sont des int.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 30-03-2008 à 22:10:52    

La taille, tu la connais forcément.
 
Si ton vecteur est représenté par un tableau de n cases (n étant donc la dimension de ton vecteur), et bien la taille mémoire est égale à n fois la taille d'un élément de ton tableau.

Reply

Marsh Posté le 30-03-2008 à 22:15:42    

merci ptitchep, c'est ce qu'il me fallait je ne savais pas comment utiliser le sizeof.
 
Et donc, moi je le trie.
 
Je dois faire fwrite apres la position de chaque terme ou bien une fois que mon vecteur est totallement trié ?
 
Merci

Reply

Marsh Posté le 30-03-2008 à 22:31:44    

Je crois que tu ne comprends pas toi-meme ce que tu veux faire.

 

Pose-toi un moment, et demande-toi "pourquoi" tu dois sauver un vecteur dans un fichier.
S'en suivra naturellement la deduction de ce que tu dois converver comme donnees, et sous quelle forme.

 

Laisse le "comment" pour l'etape d'apres, une fois que tout est clair pour toi.


Message édité par Elmoricq le 30-03-2008 à 22:32:54
Reply

Marsh Posté le 30-03-2008 à 22:40:28    

Dans le lien d'Elmoricq:
 
 
Déterminer la taille sans le type
 
Il est courant de déterminer la taille d'un objet en utilisant son type
 
{
   int *p = malloc (sizeof (int));
}
 
Si le type change, on est obligé de modifier 2 fois le code:
 
{
   long *p = malloc (sizeof (long));
}
 
Lorsqu'il s'agit d'un pointeur typé, il existe une technique alternative qui consiste à utiliser la taille d'un élément pointé par ce pointeur :
 
{
   int *p = malloc (sizeof *p);
}
 
Le changement de type se trouve largement simplifié :
 
{
   long *p = malloc (sizeof *p);
}
 
Ca sera mieux que mon sizeof(int).


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 30-03-2008 à 22:54:05    

on ne nous a pas encore apris l'utilisation de malloc...
 
Et non je ne sais pas ce que je dois faire puisque je vous le demande...
 
je voudrais simplement savoir comment enregistrer donc un vecteur dans mon fichier...
 

Reply

Marsh Posté le 30-03-2008 à 23:00:30    

pepito17 a écrit :

on ne nous a pas encore apris l'utilisation de malloc...
 
Et non je ne sais pas ce que je dois faire puisque je vous le demande...
 
je voudrais simplement savoir comment enregistrer donc un vecteur dans mon fichier...
 


c'est pas pour le malloc que j'ai mis ca, mais pour le sizeof(*p) plutot que sizeof(int).
Ben le problème c'est qu'on le comprend pas (le problème). Quand tu as rempli ton tableau, tu l'enregistres avec fwrite. Je ne vois pas quoi dire de plus...


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 30-03-2008 à 23:01:30    

merci c'est ce que je voulais savoir...
 
Merci

Reply

Marsh Posté le 30-03-2008 à 23:03:46    

bonne nuit alors


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 31-03-2008 à 16:08:21    

pepito17 a écrit :

Et non je ne sais pas ce que je dois faire puisque je vous le demande...


 
Ma boule de cristal est chez le teinturier, je ne peux pas t'aider. [:cerveau sadnoir]

Reply

Marsh Posté le 02-04-2008 à 17:21:20    

Taz a écrit :

std::copy + stream_iterator


pas du C...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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