Accueil > Forum > > > > problème de allocation de tableau
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
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Forum
MATLAB PROGRAMME MATLAB PROGRAMME par wahab1087
Cliquez pour lire la suite par wahab1087 RGB2GRAYRGB2GRAY par musa18
Cliquez pour lire la suite par musa18
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|