begin process at 2012 05 30 01:42:24
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

problème de allocation de tableau


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

problème de allocation de tableau

samedi 22 août 2009 à 20:17:53 | problème de allocation de tableau

boualiasma


Bonsoir,

Je voulais copier le contenu de fichier "exemple.txt" dans un tableau
dynamique t de taille inconnue en avance. J'utilise le tableau pour
faciliter la manipulation après.
Chaque ligne de fichier contient une chaine de caractère :
nom
prenom
age
adresse
emploi

Voici le programme:
Code :

int allocation(int N)
{
FILE *fp;
char *t,s[100],attribut[32];
int i;

t = (char *) malloc((N)*sizeof(char));
fp=fopen("exemple.txt","r");

for(i=0; i < N;i++)
{
fgets(s, 100, fp);
sscanf(s,"%s",attribut);
strcpy(t[i],attribut);
printf("%s ",t[i]);
}

fclose(fp);
return 0;
}

int main ()
{
FILE *fp;
char s[100];
int N=0;
while (fgets(s,100,fp))!=NULL)
N++;
allocation(N);
fclose(fp);
return 0;

}

J'ai remarqué que le problème déclenche juste après l'ouverture de
fichier "exemple.txt" dans la fonction allocation(N).
Comment on résoudre ce problème ?

Je serais très reconnaissant pour vos aides.

Merci.

samedi 22 août 2009 à 20:18:36 | Re : problème de allocation de tableau

boualiasma

Voici le programme:

Code C/C++ :

int allocation(int N)
{
FILE *fp;
char *t,s[100],attribut[32];
int i;

t = (char *) malloc((N)*sizeof(char));
fp=fopen("exemple.txt","r");

for(i=0; i < N;i++)
{
fgets(s, 100, fp);
sscanf(s,"%s",attribut);
strcpy(t[i],attribut);
printf("%s ",t[i]);
}

fclose(fp);
return 0;
}

int main ()
{
FILE *fp;
char s[100];
int N=0;
while (fgets(s,100,fp))!=NULL)
N++;
allocation(N);
fclose(fp);
return 0;

}

samedi 22 août 2009 à 21:14:05 | Re : problème de allocation de tableau

juju12

Ton tableau t est un tableau de N pointeurs... qui ne pointent sur rien. Faut allouer de la mémoire pour stocker les chaînes.

tu peux remplacer par exemple par :

t = (char *) malloc(32*(N)*sizeof(char));
...
strcpy(t+32*i,attribut);
printf("%s ",t+32*i);


samedi 22 août 2009 à 23:58:08 | Re : problème de allocation de tableau

boualiasma

Bonsoir,

Oui çà marche.
Mais, je ne sais pas pourquoi vous mettez 32 ?

Moi, j'ai mis en déclaration attribut[32] au hasard car je ne sais pas la taille de l'attribut. Donc, la taille de l'attribut peut dépasser 32 ou ne pas dépasser 32.

Merci.

dimanche 23 août 2009 à 13:24:26 | Re : problème de allocation de tableau

juju12

c'était parce que vous aviez mis 32...
Effectivement, cette taille doit suffir à contenir tous les attributs; s'il y en a un de longueur supérieure ça va évidemment planter; il faut choisir une taille suffisante pour être sûr que ça ira.
Si vraiment il n'y a pas de limite à la taille de l'attribut, faudra changer de méthode et allouer chaque chaîne dynamiquement après avoir récupéré la taille de l'attribut correspondant.

dimanche 23 août 2009 à 14:15:07 | Re : problème de allocation de tableau

boualiasma

Bonjour,
Votre solution marche.
Il y a une autre solution pour la fonction "allocation (N)" :

Code C/C++ :
int allocation(int N)

{
FILE *fp;
char **t,s[100],attribut[32];
int i,j;

t = malloc(N * sizeof(*t));
if(t== NULL)
{
printf("probleme d'allocation\n");
exit(0);
}

fp=fopen("exemple.txt","r");
if (fp == NULL)
{
printf("impossible d'ouvrier le fichier\n");
exit(0);
}

rewind(fp);
//copier le contenu du fichier dans le tableau
for(i=0; i < N;i++)
{
fgets(s, 100, fp);
sscanf(s,"%s",attribut);
t[i] = malloc(strlen(attribut)+1);
strcpy(t[i],attribut);
printf("%s\n",t[i]);
}

//affichage le contenu de tableau
for(j=0;j<N;j++)
printf("j=%d %s\n",j,t[j]);
fclose(fp);
return 0;
}


Cette solution consiste à créer un pointeur de pointeur sur char (char **t), d'allouer ensuite la place nécessaire pour stocker l'adresse des chaînes de caractères puis, pour chaque ligne lue, d'allouer la taille nécessaire pour contenir la chaîne et de copier cette chaîne.

- Que pensez-vous ?
- Laquelle de deux solutions est moins gourmande en mémoire et le moins en temps d'exécution ?

Merci.

dimanche 23 août 2009 à 19:05:50 | Re : problème de allocation de tableau

juju12

Très bien comme ça aussi.
Au niveau performances, la deuxième est (largement) moins rapide puisqu'il faut allouer la mémoire pour chaque chaîne.
Après, niveau mémoire, ça dépend du contenu du fichier; si tous les attributs ont plus ou moins la même taille ça sera pareil, si par contre y en a des beaucoup plus longs que d'autres la première solution sera plus gourmande en mémoire puisqu'il faudra que toutes les chaînes aient la longueur max. Après, bon, à part si le fichier est immense, la différence sera négigeable.

dimanche 23 août 2009 à 19:19:12 | Re : problème de allocation de tableau

boualiasma

Bonjour,

Je vous remercie pour votre aide. J'ai un petit problème d'ouverture d'un fichier.
J'ai remarqué que à chaque fois on appelle une fonction dans une partie du mon programme, il y a une ligne s'ajoute à la fin. ceci c'est bon et à la fin du programme j'obtiens le fichier "resultat.txt" qui contient le résultat souhaité.
Ceci grâce au mode de l'ouverture de fichier :
<code type="c">fpR = fopen ("resultat.txt","a");</code>

Mais, lorsque je exécute le programme une autre fois, je remarque que le contenu de l'ancienne exécution reste.

Je voudrais à chaque exécution j'obtiens le contenu réel du fichier "resultat.txt" et donc pas du cumul

il y a un autre mode qui permet d'ajouter à la fin du fichier et ouvrir un nouveau fichier dans la prochaine exécution ?

Que proposez-vous ?

dimanche 23 août 2009 à 20:45:36 | Re : problème de allocation de tableau

uaip

Salut,
Euh... j'ai pas tout compris. J'ai pas tout lu, donc je risque d'être hors-sujet, mais quelle idée de vouloir récupérer le contenu dans une chaine par paliers ?
Il y a des fonctions toutes prêtes pour récupérer le contenu d'un fichier dans une chaine. Moi je ferais comme ça:

Code C/C++ :

char *donnees=NULL;
void allocation() {
FILE *fichier=fopen("fichier","r");//Ouverture du fichier
if (fichier == NULL) return;//Vérification d'ouverture
fseek(fichier,0,SEEK_END);//Indicateur de position du fichier à la fin
int taille=ftell(fichier);//Nombre d'octets de 0 à l'indicateur (= taille du fichier)
rewind(fichier);//Indicateur de position du fichier au début
donnees=(char*)malloc(taille);//Tableau de même taille que le fichier
if (donnees == NULL) return; //Vérification d'allocation
int res=fread(donnees,1,taille,fichier);//Copie du contenu vers le tableau
if (res != taille) return;//Vérification de copie
fclose(fichier);//Fermeture du fichier
}
int main() {
allocation();
return 0;
}


Vire la var globale si tu veux.
Dites moi si je suis hors-sujet, sinon cette solution vaut largement les votres.

Cordialement, uaip.



Cette discussion est classée dans : problème, int, tableau, allocation, fp


Répondre à ce message

Sujets en rapport avec ce message

Problème d'entrée (cin >>) dans un tableau de float [ par Oeil_de_taupe ] Hello tout le monde,désolé de vous importuné. Mais j'ai fait une toute petite source pour apprendre à allouer de la mémoire pour une variable puis de Allocation dynamique dans une fonction [ par Veovis ] Salut,Toujours dans mon projet de TP, j'ai un petit soucis avec l'allocation dynamique dans une fonction. Ce que je voudrais faire c'est quand le tabl Allocation tableau dynamique ds structure [ par chental ] Salut à tous,Sauriez vous me dire comment allouer dynamiquement un tableau dans une structure ?J'arrive à faire l'essentiel mais dans la structure je Allocation dynamique, tableau à 2 dimensions [ par seb013 ] SalutMon problème est simple (la solution je ne sais pas). Je veux faire une allocation dynamique pour un tableau à deux dimensions. Alors pour un ta allocation dynamique d'un tableau [ par elpens ] Bonjour à tous,J'ai trouvé quelques thème sur ce forum concernant ma question, mais je n'arrive pas à l'appliquer...J'aimerai allouer dynamiquement la Problème concaténation de tableau langage c [ par lectpe ] Bonjour, dans le cadre d'un projet d'Informatique pour ma première année de licence, j'ai commencé la réalisation d'un jeu d'échecs avec un ami et pou Un problème avec les structures en C ??!! [ par IHECinformaticien ] Bonsoir/Bonjour, dans le code source qui suit, j'ai défini un tableau de type structure date( une structure qui contient le jour, le mois et l'année), Problème de compréhension tableau. [ par fhoest ] Bonjour, je débute en c++ et j'ai un problème sur le dimensionnement d'un tableau, voilà ce que je ne comprend pas je défini un tableau de 5 (case) en Probleme allocation C++ [ par elite182 ] Bonjour a tous , je dois réaliser une fonction qui range des grands nombres dans un tableau d'entier, ( ex : 2 333 546 donnera : Tab[0] = 546; tab Problème de définition de fonction dans une classe [ par labuche75 ] Bonjour à tous, je rencontre un problème à priori de définition de fonction dans la classe tableau permettant de manipuler de grands entiers nécessair


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,076 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales