fichier et liste chainée

fichier et liste chainée - C - Programmation

Marsh Posté le 24-03-2011 à 18:28:56    

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


Reply

Marsh Posté le 24-03-2011 à 18:28:56   

Reply

Marsh Posté le 24-03-2011 à 18:39:23    

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.

Reply

Marsh Posté le 24-03-2011 à 19:11:30    

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

Reply

Marsh Posté le 24-03-2011 à 20:30:34    

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

Reply

Marsh Posté le 24-03-2011 à 23:33:05    

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

Reply

Marsh Posté le 25-03-2011 à 00:46:11    

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

Marsh Posté le 25-03-2011 à 01:00:10    

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

Reply

Marsh Posté le 25-03-2011 à 01:07:36    

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

Marsh Posté le 25-03-2011 à 01:18:43    

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!

Reply

Marsh Posté le 25-03-2011 à 01:32:53    

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

Marsh Posté le 25-03-2011 à 01:32:53   

Reply

Marsh Posté le 25-03-2011 à 01:41:54    

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

Reply

Marsh Posté le 25-03-2011 à 01:50:02    

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

Marsh Posté le 26-03-2011 à 00:44:26    

j'ai du mal à parcourir ma liste :s

Reply

Marsh Posté le 26-03-2011 à 00:59:38    

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

Marsh Posté le 26-03-2011 à 01:32:46    

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); }
}

Reply

Marsh Posté le 26-03-2011 à 02:09:44    

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

Marsh Posté le 26-03-2011 à 02:20:52    

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!! :/

Reply

Marsh Posté le 26-03-2011 à 02:24:17    

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

Reply

Marsh Posté le 26-03-2011 à 02:29:12    

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

Marsh Posté le 26-03-2011 à 02:29:42    

Ah enfin! :D


---------------
sheep++
Reply

Sujets relatifs:

Leave a Replay

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