Charger le contenu dún fichier texte dans une liste chainee

Fermé
yedez Messages postés 69 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 28 avril 2015 - Modifié par yedez le 20/01/2014 à 10:28
 Utilisateur anonyme - 21 janv. 2014 à 08:02
Bonjour, 





slt :) j ai un projet a faire et le pb que mon code n execute r1 !! aidez moi a localiser mon erreur et merci

truct data
{
char *s;
int ligne;
};
typedef struct data DATA;


struct liste
{
DATA d;
struct liste *next;
struct liste *prev;
};
typedef struct liste LISTE;


void charger_liste(LISTE *first,FILE *f)
{
int l=0;
char k[100],code[100];;LISTE *p;




while (fgets(k,30,f))
{
sscanf(k,"%s",&code);
p=(LISTE*) malloc (sizeof(LISTE));

(p->d).ligne=l++;
strcpy((p->d).s,k);

fseek(f,strlen(k),SEEK_SET);
p->next=first;
first=p;
}
            
                
A voir également:

9 réponses

Utilisateur anonyme
20 janv. 2014 à 11:15
Bonjour

...
(p->d).ligne=l++;
strcpy((p->d).s,k);

Quand tu exécutes cette dernière ligne, sur quoi pointe s ? Sur rien du tout, ce pointeur n'a jamais été initialisé. Ajoute un malloc pour l'initialiser.
De plus, le dernier paramètres de strcpy ne devrait-il pas être code plutôt que k ?
1
Utilisateur anonyme
20 janv. 2014 à 16:45
le s est un char* qui est initialisé par le strcpy non? je ne sais plus si la fonction effectue l'allocation ou s'il faut la faire avant x)
0
Utilisateur anonyme
20 janv. 2014 à 16:50
Non, le strcpy n'alloue rien du tout. Et heureusement, car tu as le droit de faire un strcpy vers une zone statique. Faire une allocation automatiquement dans ce cas n'aurait pas de sens.
0
Utilisateur anonyme
20 janv. 2014 à 17:01
ok j'avais le doute, ca fait quelques temps que je n'ai pas utilisé ^^
0
yedez Messages postés 69 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 28 avril 2015 2
Modifié par yedez le 20/01/2014 à 17:35
 veuillez m execuser mai quand je fais 

s=(LISTE *)malloc (size of LISTE)
mais tjs le me probleme au lancement de console une annonce ma vertit"press any key to continue"
help pls

    
0
Utilisateur anonyme
20 janv. 2014 à 14:04
"data est divisee en deux partie une pour une chaine de caracere et l autre pour la ligne "


regarde ta définition : s est un pointeur. Il n'est pas initialisé, il pointe donc n'importe où tant que tu ne lui as pas donné une "bonne" valeur. Quand tu essayes de t'en servir comme ça, tu ne sais pas dans quelle partie de la mémoire ça va taper. Il faut lui donner l'adresse d'une zone mémoire bien définie, c'est à ça que sert l'allocation dynamique par malloc.
1
Utilisateur anonyme
20 janv. 2014 à 17:28
Toujours pas d'allocation pour s.
Mais beaucoup de blabla depuis 11h15.
Je ne comprends pas ta démarche.
1
yedez Messages postés 69 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 28 avril 2015 2
Modifié par yedez le 20/01/2014 à 17:39
non si j ai ajoute le s ai pas ds cette copie mai tjs pas d execution correcte . :/
quant a mon code il ya plein de fct qui ne sont pas faites encore g travaille sur charger liste mainetenant . C de charger liste que vs trouviez ""blablaa"" ??

    
0
yedez Messages postés 69 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 28 avril 2015 2
20 janv. 2014 à 12:19
merci pour votre reponse "le pere " mai s est un espace memoir de p pourquoi dois je faire une allocation dynamique pour s? ma liste chaine contient une partie pour le data,une pour le previous et une autre pour le next notons que data est divisee en deux partie une pour une chaine de caracere et l autre pour la ligne 

j espere que tu más compris

<codje> suis encore debutante avec l allocation dynamique</code>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
20 janv. 2014 à 16:43
salut,

J'ai l'impression qu'il manque une partie du code, par exemple le main qui te permet d'executer quelque chose.

Sinon, bien sûr comme il a été dit, il faut que ta chaine soit alloué, car sans ca tu prends le risque d'écrire sur des parcelles réservée (un exception sera levé normalement) ou encore tu risque de te faire écraser tes données (et là il n'y a pas d'erreur, tu te retrouve juste avec des résultats fou).


peux-tu fournir le main de test de ton code ?

naga
0
yedez Messages postés 69 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 28 avril 2015 2
20 janv. 2014 à 17:17
voila tout mon code ps: j ai pas termine toutes les fonctions

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct data
{
char *s;
int ligne;
};
typedef struct data DATA;


struct liste
{
DATA d;
struct liste *next;
struct liste *prev;
};
typedef struct liste LISTE;

void charger_liste(LISTE *first,FILE *f);
int open_files(FILE **f);
void view_liste(LISTE *first);
void print_data(DATA d);
void main()
{
FILE *f;
int option;
LISTE *first;
if(!open_files(&f))
exit(0);

while (option=get_option()!=0)
{
switch(option)
{
case 1:
charger_liste (first,f);
break;
case 2:
view_liste(first);
break;

}
}
fclose(f);
}
int get_option()
{
int p;
printf("1* charger votre liste\n2* afficher le contenu de la liste\n3* afficher le contenu de la ligne n1 et n2 \n");
printf("4* effacer la ligne de numero donne\n5* effacer les lignes vides\n6* effacer un bloc de n lignes \n");
printf("7* afficher les lignes indiques \n8* inserer une nouvelle ligne\n9* remplacer les sous chaines par des autres\n");
printf ("10* sauvegarder la liste \n");
scanf("%d",p);
return(p);
}



void charger_liste(LISTE *first,FILE *f)
{
int l=0;
char k[100],code[100];;LISTE *p;


while (fgets(k,30,f))
{

sscanf(k,"%s",&code);

p=(LISTE*) malloc (sizeof(LISTE));


(p->d).ligne=l++;


strcpy((p->d).s,k);

fseek(f,strlen(k),SEEK_SET);

p->next=first;

first=p;


}


}

int open_files(FILE **f_prog)
{
*f_prog=fopen("programmation.txt","r+");
if(*f_prog==NULL)
{
printf("Erreur D'ouverture Fichier programmation.txt");
return(0);
}
}
void view_liste (LISTE *first)
{
if (first)
{
print_data(first->d);
view_liste(first->next);

}
}
void print_data(DATA d)
{
printf("%s",d);
}

                
0
s=(liste *)malloc (size of LISTE)
Effectivement il n'y a pas de variable s. s est un champ de DATA et n'existe pas "tout seul"
Tu as réussi à écrire (p->d).ligne=l++; pour accéder au champ d de DATA. C'est la même chose pour accéder au champ s.
De même, il n'y pas pas de 'liste'. Il y a 'struct liste' ou 'LISTE' mais pas 'liste' tout court.

Enfin, le champ s est un pointeur sur un char : Pourquoi veux-tu forcer un type liste * au résultat du malloc ????? Et la longueur de la zone à allouer est celle de la chaîne à stocker (+1 pour le zéro final) pas celle de la structure LISTE
0
yedez Messages postés 69 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 28 avril 2015 2
20 janv. 2014 à 23:47
Bon desole pour le retard! mai en faite j ai change mon code et voila mon nouveau mai!! il ya une erreur aui s affiche lors de l execution"l instruction a 0*76392b0974 emploie  ladresse memoire a 0*00000 la memoire ne peut pas etre a l etat written!! " C'est quoi ca !!!!!!! 

aidez moi s il vous plait
0
Utilisateur anonyme
21 janv. 2014 à 08:02
je vais pas en rajouter une couche, je dirai la même chose que le père. Simplement, ta structure est composé d'un char* => allouer un objet du type de ta structure n'alloue pas ta chaine, il faut aussi l'allouer (celle de ton objet donc).
Le message que tu as découle très probablement du fait que tu ai essayé d'écrire dans une variable qui ne possède pas d'espace qui lui est alloué.
0
Utilisateur anonyme
21 janv. 2014 à 00:49
C'est typiquement le résultat d'un pointeur mal initialisé (même s'il y a d'autres causes possibles).
Comment initialises-tu s, finalement ?
0