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
Utilisateur anonyme - 21 janv. 2014 à 08:02
A voir également:
- Charger le contenu dún fichier texte dans une liste chainee
- Liste déroulante excel - Guide
- Fichier rar - Guide
- Fichier host - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
9 réponses
Utilisateur anonyme
20 janv. 2014 à 11:15
20 janv. 2014 à 11:15
Bonjour
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 ?
...
(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 ?
Utilisateur anonyme
20 janv. 2014 à 14:04
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.
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.
Utilisateur anonyme
20 janv. 2014 à 17:28
20 janv. 2014 à 17:28
Toujours pas d'allocation pour s.
Mais beaucoup de blabla depuis 11h15.
Je ne comprends pas ta démarche.
Mais beaucoup de blabla depuis 11h15.
Je ne comprends pas ta démarche.
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
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"" ??
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"" ??
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
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>
j espere que tu más compris
<codje> suis encore debutante avec l allocation dynamique</code>
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
20 janv. 2014 à 16:43
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
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
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
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);
}
#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);
}
Utilisateur anonyme
Modifié par le père. le 20/01/2014 à 17:42
Modifié par le père. le 20/01/2014 à 17:42
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
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
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
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
aidez moi s il vous plait
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é.
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é.
Utilisateur anonyme
21 janv. 2014 à 00:49
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 ?
Comment initialises-tu s, finalement ?
20 janv. 2014 à 16:45
20 janv. 2014 à 16:50
20 janv. 2014 à 17:01
Modifié par yedez le 20/01/2014 à 17:35
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