[C] probleme de tableau

probleme de tableau [C] - C - Programmation

Marsh Posté le 24-01-2006 à 12:00:22    

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

Reply

Marsh Posté le 24-01-2006 à 12:00:22   

Reply

Marsh Posté le 24-01-2006 à 12:18:28    

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!

Reply

Marsh Posté le 24-01-2006 à 13:16:32    

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

Reply

Marsh Posté le 24-01-2006 à 13:19:57    

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
Reply

Marsh Posté le 24-01-2006 à 13:29:12    

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

Reply

Marsh Posté le 24-01-2006 à 13:31:27    

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

Reply

Marsh Posté le 24-01-2006 à 13:33:04    

ok, merci

Reply

Marsh Posté le 24-01-2006 à 14:02:01    


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/
Reply

Marsh Posté le 24-01-2006 à 14:03:21    

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/
Reply

Marsh Posté le 24-01-2006 à 14:14:40    

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

Reply

Marsh Posté le 24-01-2006 à 14:14:40   

Reply

Marsh Posté le 24-01-2006 à 17:56:55    

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/
Reply

Marsh Posté le 25-01-2006 à 09:48:44    

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

Reply

Marsh Posté le 25-01-2006 à 10:00:53    

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

Reply

Marsh Posté le 25-01-2006 à 10:24:13    

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
Reply

Marsh Posté le 25-01-2006 à 12:15:24    

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

Reply

Marsh Posté le 25-01-2006 à 12:22:57    

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

Reply

Sujets relatifs:

Leave a Replay

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