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

  FORUM HardWare.fr
  Programmation
  C

  fichier et liste chainée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

fichier et liste chainée

n°2065893
marooh
Posté le 24-03-2011 à 18:28:56  profilanswer
 

bonjour,
j'essais d'ecrire un prog qui permet d'afficher à partir de la ligne n1 n2 lignes d'un fichier texte et ceci à l'aide des chaines double chainage,le code compile et tout mais ça ne fonctionne pas or je ne trouve aucune erreur,tout parait logique :??:  :??:  si vous pouvez m'aider voici mon code
 
 

Code :
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. struct dllist {
  5. char *s;
  6. struct dllist *next;
  7. struct dllist *prev;
  8. };
  9. struct dllist *head, *tail;
  10. void append_node(struct dllist *lnode);
  11. void insert_node(struct dllist *lnode, struct dllist *after);
  12. void remove_node(struct dllist *lnode);
  13. void ouvrir(FILE **fp);
  14. void utilitaire1(char *argv[],struct dllist *lnode,int pos,int nbr);
  15. int main(int argc, char **argv) {
  16. struct dllist *lnode;
  17. FILE *fp;char f[100];
  18. int pos,nbr;
  19. if(3>argc)
  20. {printf("utilisation incorrecte!!!" );exit(0);}
  21. ouvrir(&fp);
  22. sscanf(argv[3],"%d",&pos);
  23. sscanf(argv[4],"%d",&nbr);
  24. while(fgets(f,100,fp)) {
  25.   lnode = (struct dllist *)malloc(sizeof(struct dllist));
  26.   strncpy(lnode->s,f,strlen(f));
  27.   append_node(lnode);
  28. }
  29. fclose(fp);
  30. for(lnode = head; lnode != NULL; lnode = lnode->next) {
  31.   printf("%s\n", lnode->s);
  32. }
  33. if (strcmp(argv[2],"view" )==0) utilitaire1(argv,lnode,pos,nbr);
  34. while(head != NULL)
  35.   remove_node(head);
  36. getchar();
  37. return EXIT_SUCCESS;
  38. }
  39. void append_node(struct dllist *lnode) {
  40. if(head == NULL) {
  41.   head = lnode;
  42.   lnode->prev = NULL;
  43. } else {
  44.   tail->next = lnode;
  45.   lnode->prev = tail;
  46. }
  47. tail = lnode;
  48. lnode->next = NULL;
  49. }
  50. void insert_node(struct dllist *lnode, struct dllist *after) {
  51. lnode->next = after->next;
  52. lnode->prev = after;
  53. if(after->next != NULL)
  54.   after->next->prev = lnode;
  55. else
  56.   tail = lnode;
  57. after->next = lnode;
  58. }
  59. void remove_node(struct dllist *lnode) {
  60. if(lnode->prev == NULL)
  61.   head = lnode->next;
  62. else
  63.   lnode->prev->next = lnode->next;
  64. if(lnode->next == NULL)
  65.   tail = lnode->prev;
  66. else
  67.   lnode->next->prev = lnode->prev;
  68. }
  69. void utilitaire1(char *argv[],struct dllist *lnode,int pos,int nbr)
  70. {int i,j;
  71.    struct dllist  *courant ;
  72.   for (i = 1; i < pos; ++i)
  73.     courant = courant->next;
  74.     if (pos == i)
  75.     {
  76.         for (j=i;j<nbr;++j)
  77.     printf("%s\n",courant->s); }
  78. }
  79. void ouvrir(FILE **fp)
  80. {
  81. if(!(*fp=fopen("test.txt","r" )))
  82. {
  83. printf("le fichier est inexistant" );
  84. exit(0);
  85. }
  86. else printf("ouverture du fichier... \n" );
  87. }


mood
Publicité
Posté le 24-03-2011 à 18:28:56  profilanswer
 

n°2065894
mr simon
Posté le 24-03-2011 à 18:39:23  profilanswer
 

1. C'est quoi le symptome ?
2. Pkoi des listes chaines ? Lire le fichier ligne par ligne avec un compteur et hop le tour est joue ! Apres si tu veux garder en memoire ces lignes, c'est une autre question.

n°2065899
marooh
Posté le 24-03-2011 à 19:11:30  profilanswer
 

1- il ouvre le fichier et se bloque
2- je dois utiliser les listes chainées doublement

n°2065910
mr simon
Posté le 24-03-2011 à 20:30:34  profilanswer
 

1- mets des printfs ou utilise un debuggeur pour essaye de voir ce qu'il se passe
2- ok

n°2065933
marooh
Posté le 24-03-2011 à 23:33:05  profilanswer
 

d'aprés ce que j'ai écrit,il n'y a pas d'erreurs de syntaxe ou de logiques??

n°2065938
h3bus
Troll Inside
Posté le 25-03-2011 à 00:46:11  profilanswer
 

Si il y avait une erreur de syntaxe, tu ne compilerais pas.
 
De ce que je vois, tu n'alloues pas la chaine de caractère cible avant ton strncpy()
 
De plus tu devrais initialiser tes pointeurs à NULL, juste une bonne pratique.


---------------
sheep++
n°2065940
marooh
Posté le 25-03-2011 à 01:00:10  profilanswer
 

je n'ai pas bien compris "tu n'alloues pas la chaine de caractère cible avant ton strncpy() "

n°2065941
h3bus
Troll Inside
Posté le 25-03-2011 à 01:07:36  profilanswer
 

Code :
  1. strncpy(lnode->s,f,strlen(f));


 
lnode->s doit être préalablement alloué par un malloc(strnlen(f)+1)
En effet strlencpy n'alloue pas ton buffer cible.  
 
Une autre solution mais qui bouffe plus de mémoire est de déclarer ta structure dllist avec un

Code :
  1. char s[100]


au lieu de

Code :
  1. char *s;


---------------
sheep++
n°2065942
marooh
Posté le 25-03-2011 à 01:18:43  profilanswer
 

j'ai fais le changement de char s [100] mais là à l'execution il m'affiche toutes les lignes de mon texte séparé par une ecriture bizzare!

n°2065944
h3bus
Troll Inside
Posté le 25-03-2011 à 01:32:53  profilanswer
 

strlncpy() ne rajoute pas de '\0' à la destination si il n'en rencontre pas dans le nombre de caractère imparti.
 
Le 1 du strlen(f)+1 de ma réponse précédente n'est pas là pour faire joli...
 


---------------
sheep++
mood
Publicité
Posté le 25-03-2011 à 01:32:53  profilanswer
 

n°2065945
marooh
Posté le 25-03-2011 à 01:41:54  profilanswer
 

oui mais le truc c'est qu'il maffiche ttes le lignes de mon fichier et nn pas le nbre n2 que j'ai choisi

n°2065947
h3bus
Troll Inside
Posté le 25-03-2011 à 01:50:02  profilanswer
 

Ben oui de la ligne 35 à 37 de ton code, ta boucle for affiche toutes les lignes...

 

Quand à la fonction utilitaire1(), elle doit gentiment planter.
Pense à vérifier l'initialisation de tes variables et ce que font chacune de tes boucles (surtout la deuxième).

Message cité 1 fois
Message édité par h3bus le 26-03-2011 à 00:52:08

---------------
sheep++
n°2066186
marooh
Posté le 26-03-2011 à 00:44:26  profilanswer
 

j'ai du mal à parcourir ma liste :s

n°2066187
h3bus
Troll Inside
Posté le 26-03-2011 à 00:59:38  profilanswer
 

Ben tu la parcoures bien dans ta première boucle for.
Par contre comme au début de ta fonction, courant n'est pas initialisé, ça ne peux pas le faire.
 
Ton deuxième for ne parcoure rien du tout.
 
Enfin tu n'appelles pas ta fonction avec les bon arguments dans le main().


---------------
sheep++
n°2066189
marooh
Posté le 26-03-2011 à 01:32:46  profilanswer
 

re,
j'ai modifié cette fonction et maintenant elle m'affiche juste la ligne qui vient apré la ligne n1 que j'ai indiqué et nn pas le nbre de ligne n2  
voici la nouvelle ecriture
void utilitaire1(char *argv[],struct dllist *lnode,int pos,int nbr)
{int i;
   struct dllist  *courant ;
   courant=head;
  for (i = 1;(courant)&& (i < pos); i++)
    courant = courant->next;
    if (pos == i)
    {do
    {printf("%s\t\n",courant->next->s);
    }
    while(i>nbr); }
}

n°2066190
h3bus
Troll Inside
Posté le 26-03-2011 à 02:09:44  profilanswer
 

C'est mieux mais...

 

Regarde:

 
Code :
  1. /* Print pNb_print lines starting from pFirst_line from pStart_node (included) */
  2. void printNLinesFrom(struct dllist* pStart_node, unsigned int pFirst_line, unsigned int pNb_print)
  3. {
  4.    int lIndex = 1; // Line counter
  5.    struct dllist* lCurrent_node = pStart_node; // Start at given head of list
  6.  
  7.    // Loop while end of list or last displayed line are not reached
  8.    while ( lCurrent_node != NULL && lIndex < (pFirst_line + pNb_print) )
  9.    {
  10.        if ( lIndex >= pFirst_line && lIndex < (pFirst_line +  pNb_print) )
  11.            printf("%s",  lCurrent_node->s);
  12.        
  13.        // Process next list item
  14.        lCurrent_node =  lCurrent_node->next;
  15.        lIndex++;
  16.    }
  17. }
 

PS: je sais pas si ça compile, mais l'idée est là

 

Edit:  lIndex ++ !!


Message édité par h3bus le 26-03-2011 à 02:18:08

---------------
sheep++
n°2066191
marooh
Posté le 26-03-2011 à 02:20:52  profilanswer
 

j'ai essayé mais cette fonction m'affiche ttes les lignes de mon fichier et si seulemnt si pFirst_line =1 si je mets 2 ça bloque et ça ne prend pas en charge pNb_print puisqu'il affiche ttes les lignes!! :/

n°2066193
marooh
Posté le 26-03-2011 à 02:24:17  profilanswer
 

c bon j'ai trouvé merci infiniment!!! ^^

n°2066194
h3bus
Troll Inside
Posté le 26-03-2011 à 02:29:12  profilanswer
 

Non!
 

h3bus a écrit :

Ben oui de la ligne 35 à 37 de ton code, ta boucle for affiche toutes les lignes...


 
Ensuite si tu a appelé ma fonction avec les même paramètres que ton utilitaire1() ça va pas marcher non plus, comme je te l'ai déjà signalé.


---------------
sheep++
n°2066195
h3bus
Troll Inside
Posté le 26-03-2011 à 02:29:42  profilanswer
 

Ah enfin! :D


---------------
sheep++

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

  fichier et liste chainée

 

Sujets relatifs
enregistrement fichier excel 2007 en pdfCréation d'un lien HTML vers un fichier local
Prendre l'ip et la comparer a une liste : comment ?Help ! AJAX - POST et PHP pour fichier CSV
Code pour changer l'orde d'un nom de fichier[Resolu] Transformation d'un fichier en liste doublement chainée
Liste chainée dans un fichierProblème de Procedure avec liste chainée et fichier
liste chainée et traitemenbts de fichierPbs structure en liste chainée et manip de fichier
Plus de sujets relatifs à : fichier et liste chainée


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