Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1188 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] probleme de tableau

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] probleme de tableau

n°1290805
shreck
Posté le 24-01-2006 à 12:00:22  profilanswer
 

bonjour !
bah voila, je veux lire un fichier, composé dadresses Ip, chaque ligne contient une adresse, de longueur de caractere différente.
 

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <io.h>
  4. #include <fcntl.h>
  5. int main()
  6. {   int h_fic,nb_car_lus,i;
  7.     char ligne[30];
  8.     int fd;
  9.    
  10.    
  11.     h_fic = open ("c:\\firewall\\ip_dest.txt", O_RDONLY);
  12.    
  13.     if (h_fic == -1)                       
  14.     { 
  15.        printf("impossible d'ouvrir le fichier, déja ouvert peut-etre... \n" );
  16.        getch();
  17.        return (1);
  18.     }
  19.    
  20.     while (!eof (h_fic))
  21.     {             
  22.              nb_car_lus = read (h_fic, ligne, 30);
  23.              for (i=0; i<nb_car_lus;i++)
  24.                 {
  25.                  printf("%c",ligne[i]);
  26.                 }
  27.                
  28.              printf("\n" );
  29.              fd =  open("c:\\firewall\\fich_sortie.txt", O_CREAT | O_RDWR, 0644);
  30.              write(fd, ligne, sizeof ligne);
  31.              
  32.     }
  33.    
  34.     close(h_fic);
  35.     close(fd);
  36.     printf("---fin---\n" );
  37.     getch();
  38.     return 0;
  39. }


 
 
 
donc , ca m'ouvre le fichier contenant les adresses en lecture, et un autre en écriture pour ré écrire les adresses.
mais sur le fichier en écriture je n'obtient que  
"0
192.168.1.10
12.130.3.4520"
donc probleme, ca me met que les 30 premiers caracteres, moi jaimerai que a chaque ligne,ca passe a la suivante.
du genre : while (ligne[i]!='\n') etc, mais ca marche pas.
 
Un petit coup de pouce ne serai pas de refus.
merci beaucoup

mood
Publicité
Posté le 24-01-2006 à 12:00:22  profilanswer
 

n°1290823
breizhbugs
Posté le 24-01-2006 à 12:18:28  profilanswer
 

Salut,
commence par sortir cette ligne de la boucle while:
fd =  open("c:\\firewall\\fich_sortie.txt", O_CREAT | O_RDWR, 0644);
 
Je suis pas sur mais je crois que tu creer un nouveau fichier a chaque boucle!

n°1290850
shreck
Posté le 24-01-2006 à 13:16:32  profilanswer
 

non, jai modifié mais ca me fait toujours pareil...

n°1290853
Trap D
Posté le 24-01-2006 à 13:19:57  profilanswer
 

D'une part, il est certain qu'il faut ouvrir une seule fois le fichier en écriture (donc hors de la boucle).  
D'autre part, pour ce que tu as à faire l'ouverture avec fopen, la lecture avec fgets (puisque ton fichier est organisé en lignes, en plus de longueurs diférentes, le read n'est pas très adapté dans ce cas)  et l'écriture avec fprintf sont suffisants.


Message édité par Trap D le 24-01-2006 à 13:21:58
n°1290855
shreck
Posté le 24-01-2006 à 13:29:12  profilanswer
 

je débute en C, je ne sais absolument pas comment marche fopen, ni fprintf, ni fgets..

n°1290858
Trap D
Posté le 24-01-2006 à 13:31:27  profilanswer
 

Tu n'as pas de livre de C ?  
Je te conseille le Kernigham et Ritchie.  
Là pour tout expliquer je vais manquer de temps...

n°1290859
shreck
Posté le 24-01-2006 à 13:33:04  profilanswer
 

ok, merci

n°1290870
Emmanuel D​elahaye
C is a sharp tool
Posté le 24-01-2006 à 14:02:01  profilanswer
 


Commentaires ... (-ed-)

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <io.h>
  4. #include <fcntl.h>
  5. /* -ed- pas standard */
  6. int main()
  7. {   int h_fic,nb_car_lus,i;
  8.     char ligne[30];
  9.     int fd;
  10.    
  11.    
  12.     h_fic = open ("c:\\firewall\\ip_dest.txt", O_RDONLY);
  13. /* -ed- horrible. Utiliser fopen(), c'est standard et c'est fait pour. */   
  14.     if (h_fic == -1)                       
  15.     { 
  16.        printf("impossible d'ouvrir le fichier, déja ouvert peut-etre... \n" );
  17.        getch();
  18.        return (1);
  19.     }
  20.    
  21.     while (!eof (h_fic))
  22. /* -ed- NON! tester le retour de la fonction de lecture
  23.    http://mapage.noos.fr/emdel/notes.htm#fichiers
  24. */
  25.     {             
  26.              nb_car_lus = read (h_fic, ligne, 30);
  27. /* -ed- pour lire une ligne : fgets() */
  28.              for (i=0; i<nb_car_lus;i++)
  29.                 {
  30.                  printf("%c",ligne[i]);
  31.                 }
  32.                
  33.              printf("\n" );
  34.              fd =  open("c:\\firewall\\fich_sortie.txt", O_CREAT | O_RDWR, 0644);
  35. /* -ed- et si open() / fopen() echoue ?  
  36. tu ouvres a chaque tour ?  
  37. et tu ne fermes qu'une fois ?  
  38. Tu fais souffrir ton systeme de fichier inutilement...  
  39. */
  40.              write(fd, ligne, sizeof ligne);
  41. /* -ed- fputs() / fprintf()  */             
  42.     }
  43.    
  44.     close(h_fic);
  45.     close(fd);
  46.     printf("---fin---\n" );
  47.     getch();
  48.     return 0;
  49. }


Si tu ne veux que copier le fichier, ceci suffit :  


#include <stdio.h>
 
#define F_IN "in.txt"
#define F_OUT "out.txt"
 
int main (void)
{
   FILE *fp_src = fopen (F_IN, "rb" );
 
   if (fp_src != NULL)
   {
      FILE *fp_des = fopen (F_OUT, "wb" );
 
      if (fp_des != NULL)
      {
         int c;
 
         while ((c = fgetc(fp_src)) != EOF)
         {
            fputc(c, fp_des);
         }
 
         fclose (fp_des), fp_des = NULL;
      }
      else
      {
         perror(F_OUT);
      }
      fclose (fp_src), fp_src = NULL;
   }
   else
   {
      perror(F_IN);
   }
   return 0;
}


Message édité par Emmanuel Delahaye le 24-01-2006 à 14:02:35

---------------
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/
n°1290871
Emmanuel D​elahaye
C is a sharp tool
Posté le 24-01-2006 à 14:03:21  profilanswer
 

shreck a écrit :

je débute en C, je ne sais absolument pas comment marche fopen, ni fprintf, ni fgets..


What ? Tu débutes et tu manipules déjà des fonctions systèmes ? Tu te formes comment ?


Message édité par Emmanuel Delahaye le 24-01-2006 à 17:52:46

---------------
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/
n°1290882
shreck
Posté le 24-01-2006 à 14:14:40  profilanswer
 

oui , je débute, je connais rien au C.
ce que jai un début : un fichier avec des adresses ip sur chaque ligne.
ce que je veux : un autre fichier avec les meme adresses mais classées par ordre de grandeur..
je ny arrive vraiment pas !
merci

mood
Publicité
Posté le 24-01-2006 à 14:14:40  profilanswer
 

n°1291222
Emmanuel D​elahaye
C is a sharp tool
Posté le 24-01-2006 à 17:56:55  profilanswer
 

shreck a écrit :

oui , je débute, je connais rien au C.


Alors il faut commencer par le début et suivre un livre ou un tutoriel (des références sur mon site). Le C un outil trop tranchant pour être mis entre les mains d'un débutant sans formation. Il faut 3 à 6 mois minimum  

Citation :


ce que jai un début : un fichier avec des adresses ip sur chaque ligne.
ce que je veux : un autre fichier avec les meme adresses mais classées par ordre de grandeur..


C'est un exercice de C ou bien c'est un besoin professionel ? Si c'est le 2ème cas, apprends plutôt à utiliser les fonctions évoluées de ton system / shell.


---------------
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/
n°1291639
shreck
Posté le 25-01-2006 à 09:48:44  profilanswer
 

je ne pense pas que le shell permette de réorganiser une liste, meme avec le awk ou le sed..
dites moi si je me trompe..
merci

n°1291650
durkheim
Posté le 25-01-2006 à 10:00:53  profilanswer
 

sissi, le shel unix le permet, je l'ai fait dans un exo, par contre j'ai plus le nom de la fonction en tête...

n°1291673
Sve@r
Posté le 25-01-2006 à 10:24:13  profilanswer
 

shreck a écrit :

je ne pense pas que le shell permette de réorganiser une liste, meme avec le awk ou le sed..
dites moi si je me trompe..
merci


Le shell ne fait pas grand chose à part gérer des variables, permettre les alternatives et les boucles. Mais il possède un mécanisme qui le rend exceptionnel: la délégation.
Il peut déléguer aux programmes externes (grep, sed, tr, awk) ce qu'il ne sait pas faire lui-même. Soit il utilise des pipes, soit il utilise des backquottes (ça dépend de ce qu'on veut faire)
Toi, je pense que tu peux t'en sortir avec "sort"
Tuto de shell ici: http://fr.lang.free.fr/cours/Shell_v1.4.pdf
 
Pour le reste (fopen, fgets, etc) , tuto de C ici http://fr.lang.free.fr/cours/Langa [...] e_v2.0.pdf et/ou ici http://mapage.noos.fr/emdel
 

breizhbugs a écrit :

Je suis pas sur mais je crois que tu creer un nouveau fichier a chaque boucle!


Non. L'option "O_CREAT" permet de créer le fichier s'il n'existe pas mais ne fait rien s'il existe déjà (on peut éventuellement le réinitialiser en rajoutant l'option "O_TRUNC" ). Cependant, en effet, faire un "open" à chaque tour de boucle n'est pas bon car le pointeur de lecture se réinitialise à chaque fois au début du fichier...


Message édité par Sve@r le 25-01-2006 à 10:25:44
n°1291818
shreck
Posté le 25-01-2006 à 12:15:24  profilanswer
 

merci beaucoup a tous, je pense que je men sortirai avec tout ce que vous mavez dit.

n°1291828
shreck
Posté le 25-01-2006 à 12:22:57  profilanswer
 

avec le "sort" ca marche parfaitement
merci beaucoup a tous (surtt sve@r)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] probleme de tableau

 

Sujets relatifs
problème avec case à cocher[css/html] probleme zone décalée.
Problème avec xdocletProbleme SQL dans ASP
Probleme Response.WriteProblème pour récupérer donnée en php
petit probleme d'animationProblème Upload
[URL Rewriting] Problème de .htaccess sous Apache 2 ...Probleme de tri sql
Plus de sujets relatifs à : [C] probleme de tableau


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR