IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Recuper un fichier csv (colonne) dans un tableau de structure


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 27
    Points : 6
    Points
    6
    Par défaut Recuper un fichier csv (colonne) dans un tableau de structure
    Bonjour, suite à plusieurs recherches, je n'ai toujours pas réussi a effectuer cette tache.

    j'ai bien trouver ça : http://www.clubic.com/forum/de-fichi...12189.htmlmais j'ai du mal a comprendre d'ou vien buffer etc ..

    le fichiers est du type

    pays;ville;aeroport;longuerdelapiste

    (france;paris;bourget;1800
    usa;nyc;jfk;1200 etc etc)

    comment stocker chaque celule dans une partie de ma structure ?

    ma structure serais :

    struct AEROPORT
    { char nompays[50];
    char nomville[50];
    char nomaeroport[50];
    int longueur;
    } ;

    struct AEROPORT listeaeroport[512]; // ici c'est mon tableau d'aéroport.


    Merci d'avance !

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Comme d'hab, fgets, suivi d'un strok ou de sa version safe strok_s pour pister les ';'.

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 27
    Points : 6
    Points
    6
    Par défaut
    comment le strtok sait ou il en ai dans le fichier ?
    ça se réinisialise ?

    je comprends mieux avec un morceaux de code..
    je suis sur la bonne voi la : while((fgets(line,LINELENGH,lireaeroports))&&(strcmp(line,";;;\n")))
    {
    listeaeroport[i].nompays =strtok (line, ";" );

    // i c'est pour incrémenter, soir, aéroport numéro 1, 2 3 etc etc.

    mais je comprends pas bien la fonction "strtok",

    j'ai trouver : strtok(char *chn1, const char *chn2)

    Sépare chn1 en sous-chaînes délimitées par n'importe quel caractères de chn2. Par exemple : char *sChaine = (char*)malloc(20*sizeof(char)); strcpy(sChaine,"Non d'un chien."); strtok(sChaine,"c");. sChaine affichera "Nom d'un ", car elle aura été "découpée" en deux chaînes : "Nom d'un " et "hien.", le 'c' ayant en fait été remplacé par un '\0'.

    comment relier mon fgets, ma structure et le strtok ?

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Pour convertir les données dans le bon type utilise strtol, strtod, dont tu trouveras la documentation sur le net sans aucun problème.
    pour les chaines, tu recopies dans les champs de ta structure.

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 27
    Points : 6
    Points
    6
    Par défaut
    J'ai ecris cela, mais je ne vois pas comment récuperer tout les champs ! (pays, vile, nom, distance !)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    	FILE*lireaeroports = (FILE*)NULL;
    	char line [LINELENGH]; char cellule [CELLLENGH];
    	int debcell=0; int fincell=0; int nbcell=0;
     
    	lireaeroports = fopen("FichierAeroport.csv", "r");
    	if (!lireaeroports) {fprintf(stderr,"Le fichier FichierAeroport.csv n'est pas dans la racine du répertoire.");}
     
    	char	*separateur = { ";" };
    	char	*pcourant;
    	char *buffer;
    	while((fgets(line,LINELENGH,lireaeroports))&&(strcmp(line,";;;\n"))) 
    	{      
    		buffer = strdup (line);
    		pcourant = strtok(buffer, separateur);
    		listeaeroport[i].nompays = *pcourant
    		while( pcourant != NULL )
    		{
    		// Cherche les autres separateur
    		pcourant = strtok( NULL, separateur );
    		if ( pcourant != NULL )
    		{
    		//nb_mot++; // increment du nombre de mot
    		listeaeroport[i].nomville = *pcourant
    		// comment stocker tt les champs ? distance et autre ?
    		}
    		}
     
    		i++;

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par gdlbb
    J'ai ecris cela, mais je ne vois pas comment récuperer tout les champs ! (pays, vile, nom, distance !)

    FILE*lireaeroports = (FILE*)NULL;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    	while((fgets(line,LINELENGH,lireaeroports))&&(strcmp(line,";;;\n"))) 
    	{      
    		buffer = strdup (line);
    		pcourant = strtok(buffer, separateur);
    		listeaeroport[i].nompays = *pcourant
    		while( pcourant != NULL )
    		{
    		// Cherche les autres separateur
    		pcourant = strtok( NULL, separateur );
    		if ( pcourant != NULL )
    		{
    		//nb_mot++; // increment du nombre de mot
    		listeaeroport[i].nomville = *pcourant
    		// comment stocker tt les champs ? distance et autre ?
    		}
    		}
     
    		i++;
    Chaque pcourant pointe sur une nouvelle chaine représentant la valeur du champ suivant. Il suffit de faire les traitements à la suite (il serait peut-être plus clair de 'dérouler'...)

    Pour copier une chaine, c'est strcpy()...

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    J'ai corrigé ton bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    struct AEROPORT
    { char nompays[50];
    char nomville[50];
    char nomaeroport[50]; 
    int longueur; 
    } ;
     
    #define LINELENGH 256
    #define MAX_AERO 512
    int main(void)
    {
    	FILE*lireaeroports = (FILE*)NULL;
    	char line [LINELENGH]; 
    /*	
    	char cellule [CELLLENGH];
    	int debcell=0; int fincell=0; int nbcell=0;
    */
    	char *separateur = { ";" };
    	char *pcourant;
    	char *buffer;
    	struct AEROPORT listeaeroport[MAX_AERO]= {0}; 
        int nbaero = 0;
    	int i;
     
    	lireaeroports = fopen("FichierAeroport.csv", "r");
    	if (!lireaeroports) 
    	{
    		fprintf(stderr,"Le fichier FichierAeroport.csv n'est pas dans la racine du répertoire.");
    		exit(EXIT_FAILURE);
    	}
     
    	while(fgets(line,LINELENGH,lireaeroports)&&strcmp(line,";;;\n") && nbaero < MAX_AERO) 
    	{ 
    		buffer = strdup (line);
     
    		if (buffer == NULL)
    		{
    			fprintf(stderr,"Problème d'allocation mémoire.");
    			fclose(lireaeroports);
    			exit(EXIT_FAILURE);
    		}
     
    		pcourant = strtok(buffer, separateur);
     
    		if (pcourant != NULL)
    			strncpy(listeaeroport[nbaero].nompays, pcourant, 49);
    		else
    		{
    			fprintf(stderr,"La ligne %s du fichier FichierAeroport.csv n'est pas correcte.", line);
    			free(buffer);
    			break;
    		}
     
    		// non pas de while car les rensignements sont de types différents
    		//while( pcourant != NULL )
     
    		// recherche de la ville
    		pcourant = strtok(NULL, separateur);
    		if (pcourant != NULL)
    			strncpy(listeaeroport[nbaero].nomville, pcourant,49);
    		else
    		{
    			fprintf(stderr,"La ligne %s du fichier FichierAeroport.csv n'est pas correcte.", line);
    			free(buffer);
    			break;
    		}
     
    		// recherche du nom de l'aeroport
    		pcourant = strtok(NULL, separateur);
    		if (pcourant != NULL)
    			strncpy(listeaeroport[nbaero].nomaeroport, pcourant,49);
    		else
    		{
    			fprintf(stderr,"La ligne %s du fichier FichierAeroport.csv n'est pas correcte.", line);
    			free(buffer);
    			break;
    		}
     
    		// recherche de ??
    		pcourant = strtok(NULL, separateur);
    		if (pcourant != NULL)
    			listeaeroport[nbaero].longueur = strtol(pcourant, NULL, 10);
    		else
    		{
    			fprintf(stderr,"La ligne %s du fichier FichierAeroport.csv n'est pas correcte.", line);
    			free(buffer);
    			break;
    		}
     
    		// il faut libérer la mémoire allouée par strdup
    		free(buffer);
    		nbaero++;
    	}
    	fclose(lireaeroports);
     
    	// on affiche les résultats
    	printf("Pays\t\tVille\t\tAéroport\t\tDistance\n");
    	for(i=0; i < nbaero; i++)
    		printf("%s\t\t%s\t\t%s\t\t%d\n", listeaeroport[i].nompays, listeaeroport[i].nomville,
    			listeaeroport[i].nomaeroport, listeaeroport[i].longueur);
     
    	return EXIT_SUCCESS;
     
    }
    Pose des questions si tu ne comprends pas.

  8. #8
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 27
    Points : 6
    Points
    6
    Par défaut
    I] MERCI

    1) pourquoi est on obliger de passser par un buffer, c'est pour copier la line dans un espace mémoire avec les droit d'ecriture pour le tronquer ?

    2) buffer = strdup (line); je ne connais pas bien cette commande, "strdup" duplique une chaine, mais quel différence entre dupliquer et copier ? (strcpy) c'est nivo de l'allocation mémoire que strdup prends juste ce dont il a besoin ?

    3)pk passe t'on de pcourant = strtok(buffer, separateur);

    a pcourant = strtok(NULL, separateur); (pour le champs suivant a remplir par exemple, içi ça positione le curseur au début d'une nouvelle case, en gros sur le ; ? mais avant, comme ya pas de ;, on lui "donne" "buffer ?"

    4)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pcourant = strtok(NULL, separateur);
    		if (pcourant != NULL)
    			listeaeroport[nbaero].longueur = strtol(pcourant, NULL, 10);
    		else....
    on est obligé de passer par strtol (convertie une chaine en un entier long je crois) car la longuer est déja de type int ? c'est par prudence que on passe par cette fonction ? pour etre sur de copier avec le bon type ?

    4) pas très important, mais la ligne exit(EXIT_FAILURE); exit est une commande connu, c'est plus propre de rajouter cette ligne que de rien mettre ? (un return -1 a la place ?


    pour info, le dernier champs, c'est la longueur de la piste la plus longue de chaque aéroport... (entier)



    En tout cas, ça marche fort bien, vous m'avez enlever un sacré épine du pied, je ne sais comment vous remerciez tous, d'avoir passez un peu de temps sur mon problème. ce forum est très agréable, j'essayerais moi mème quand j'aurai plus avancer dans mes études, de répondre aux questions de novice (si j'y arrive j'èspère., mais ça seras pas avant 5 ans...)

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par gdlbb

    1) pourquoi est on obliger de passser par un buffer, c'est pour copier la line dans un espace mémoire avec les droit d'ecriture pour le tronquer ?
    Ce n'est pas obligatoire, le problème de strtok est qu'il modifie la chaîne passée en argument, on utilise donc strdup pour en faire une copie et conserver l'original.
    Citation Envoyé par gdlbb
    2) buffer = strdup (line); je ne connais pas bien cette commande, "strdup" duplique une chaine, mais quel différence entre dupliquer et copier ? (strcpy) c'est nivo de l'allocation mémoire que strdup prends juste ce dont il a besoin ?
    strdup alloue de la mémoire et recopie la chaîne passée en argument dedans (la mémoire allouée à juste la bonne taille strlen(chaîne)+1 je crois , il faut libérer la mémoire allouée sinon il y a fuite de mémoire, "pas grave" si c'est un petit prog d'essai, catastrophique si c'est un problème qui tourne tout le temps et qui fait énormément de strdup.
    Citation Envoyé par gdlbb
    3)pk passe t'on de pcourant = strtok(buffer, separateur);

    a pcourant = strtok(NULL, separateur); (pour le champs suivant a remplir par exemple, içi ça positione le curseur au début d'une nouvelle case, en gros sur le ; ? mais avant, comme ya pas de ;, on lui "donne" "buffer ?"
    C'est le processus (archaïque ) d'utilisation de strtok. Il n'y a qu'une seule instance de strdup fonctionnant à la fois en mémoire, donc après l'initialisation de strtok avec un ptr = strtok(chaîne, separateur), la fonction strok sait quelle chaîne elle doit utiliser. C'est pour celà qu'on dit que strtopk n'est pas réentrant car dans un contexte multithread, avec des appels croisés à strtok on obtient n'importe quoi, il ne FAUT pas utiliser strtok en multithread, il existe une version "safe" strok_s sous Microsoft C.
    Citation Envoyé par gdlbb
    4)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pcourant = strtok(NULL, separateur);
    		if (pcourant != NULL)
    			listeaeroport[nbaero].longueur = strtol(pcourant, NULL, 10);
    		else....
    on est obligé de passer par strtol (convertie une chaine en un entier long je crois) car la longuer est déja de type int ? c'est par prudence que on passe par cette fonction ? pour etre sur de copier avec le bon type ?
    strtol est LA seule fontion de conversion d'une chaîne en entier (atoi ne doit plus être utilisée) , elle renvoie un entier qui peut-être converti ensuite en short ou même char éventuellement selon les besoins.
    Citation Envoyé par gdlbb
    4) pas très important, mais la ligne exit(EXIT_FAILURE); exit est une commande connu, c'est plus propre de rajouter cette ligne que de rien mettre ? (un return -1 a la place ?
    Bonne question, je crois qu'exit permet un appel des fonctions de terminaison de programme (nettoyage de mémoire, de fichiers temporaires etc) alors que return ne le permet pas, à confirmer par des spécialistes style Emmanuel. Exit_FAILURE permet d'indiquer au système d'exploitation un code retour qui cpeut-être utilisé lors d'un enchaînement de programmes.
    Citation Envoyé par gdlbb
    pour info, le dernier champs, c'est la longueur de la piste la plus longue de chaque aéroport... (entier)



    En tout cas, ça marche fort bien, vous m'avez enlever un sacré épine du pied, je ne sais comment vous remerciez tous, d'avoir passez un peu de temps sur mon problème. ce forum est très agréable, j'essayerais moi mème quand j'aurai plus avancer dans mes études, de répondre aux questions de novice (si j'y arrive j'èspère., mais ça seras pas avant 5 ans...)

  10. #10
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 27
    Points : 6
    Points
    6
    Par défaut
    Maintenant que j'ai a quasiment compris grace à vous!

    j'essaye maintenant d'importer un nouveau fichier, mais c'est bien plus difficile, car celui ci est disposer en colonne et non pas en ligne !

    cf la différence :

    les aéroports : (plus facile...) ( et déja RESOLU plus haut)


    soit en Bloc note :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Pays;Ville;Aéroport;Longueur de piste en metres
    France;Paris;Le bourget;1845
    USA;Chicago;O'Hare;2286
    USA;Atlanta;Hartsfield-Jackson;2743
    USA;New York;JFK;4442
    USA;San Francisco;San Francisco;2286
    Suisse;Bâle-Mulhouse;Bâle-Mulhouse;1820
    (FACILE, puisque c'est disposé en ligne.)

    MAIS pour les avions, c'est plus difficile ! (en colonne...) (Pas encore Résolu)



    soit en bloc note, un joyeux bordel, mais bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Companie;Raytheon;Raytheon;Gulstream;Bombardier;Bombardier;Dassault;Dassault;Dassault;Dassault;Eclipse ;Embraer ;Cessna;Cessna
    Nom avion;Hawker 4000;Hawker 400;G550;Challenger 600;Global Express 700;Falcon 50;Falcon 2000;Falcon 900;Falcon 7X;Eclipse 500;135 BJ-Legacy;Citation X;Citation Sovereign
    Nombre passagers;8;8;18;19;19;19;19;19;19;5;30;12;12
    Envergure en metre;18,82;13,25;27,69;19,61;28,65;18,85;19,33;19,33;25,17;11,4;26,3;19,38;19,25
    Surface voilure en m²;49,3;22,43;105,63;48,31;94,95;46,83;49,02;49;70,7;30;72;48,96;47,93
    Masse Zero fuel weigth Kg;11 340;5 896;22  ETC ETC ETC, c'est inbitable :lol: 

    donc, il faut que j'arive a recopier chaque champs dans ma nouvelle strucutre avions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct AVION
    		{ char compagnie[50];char nom[50];int nbrpass; float envergure; float surfacevoilure; float masseZWF; float MTOW; float MaxFuelWeigh; float PayloadWithMaxFuel; float altitude; float range; float mach; float longueurdecolage; float longueuratterrisage; float consospecifique; float prix; } ;
    	struct AVION listeavion[MAX_AVION];
    	int nbavion = 0;

    Voili, j'essaye, et je continurais de poster içi si je re bloque encore au bout de 3 h (ça fait déjà 1 h que j'essaye de comprendre l'astuce...)

    je pesne a des incrémentation sucessive, pour reprendre au début, mais j'ai du mal avec les positionement du curseur (ou pointeur) pcourant dans mon fichier. (j'ai bcp d'erreur a l'execution "monapplication.exe a rencontrer un pb")

  11. #11
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Comme tu le dis il me semble, lorsque tu lis la première ligne, tu remplis le premier champ de chaque élément de ton tableau de structure, tu connais ainsi le nombre d'élément de ton tableau, ensuite pour la deuxième ligne, tu reprends à zéro en remplissant le deuxième champ, etc.
    Il faut donc autant de "modules" de lectures que tu as de champs à remplir dans ta structure, mais le principe d'obtention des données reste le fondamentalement le même.

  12. #12
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 27
    Points : 6
    Points
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    while(fgets(line,LINELENGH,lireavion)&&strcmp(line,";;;;;;;;;;;;;\n") && nbavion < MAX_AVION) 
    	{ 
    		buffer = strdup (line);
     
    		if (buffer == NULL)
    		{
    			fprintf(stderr,"Problème d'allocation mémoire.");
    			fclose(lireaeroports);
    			exit(EXIT_FAILURE);
    		}
    		pcourant = strtok(buffer, separateur);
    		for (nbavion=0; nbavion<=MAX_AVION; nbavion++)   // içi pour chaque avion, il est censé enregister la première ligne du fichiers dans le
    // premier champs de ma strucutre (il enregistre tout les compagnie différente d'avion, pas le reste pour l'instant)
    			{
    				if (pcourant != NULL)
    					strncpy(listeavion[nbavion].compagnie, pcourant, 49);
     
    				else
    					{
    						fprintf(stderr,"La ligne %s du fichier FichierAvion.csv n'est pas correcte.", line);
    						free(buffer);
    						break;
    					}pcourant = strtok(NULL, separateur);
    			}

    la a chaque fois il me dit "la ligne blabla du fichieravions.csv est pas correcte", (en gros il passe dans le "else" a chaque fois !) et puis un beau plantage du programme.


    EDIT : ça y est je bloque sévère, j'arrive pas me dépatouiller ! donc, Help pourquoi c'est t'y don qu'sa morche po c'taffaire vindiou !

  13. #13
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    tu as simplement oublié de tester le retour de strtok, tu dois t'arréter qsuand tu auras lu la ligne, pas recherché 512 vols si je me souviens bien !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		for (nbavion=0; pcourant != NULL && nbavion<MAX_AVION; nbavion++)
    Attention, tu cherchais un avion de trop il faut '<' et non pas '<='

  14. #14
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 27
    Points : 6
    Points
    6
    Par défaut
    ok c'est déja ça, maitenat, a l'affichage, pour vérifier le bon remplissage des champs, ça beug, je voit que des sympboles louches !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(i=0; i < nbavion; i++)
    		printf("la compagnie de l'avion numéro %i est %s \n", i, listeavion[i].compagnie);
    	// ou bien "puts(listeavion[i].compagnie)" ou 1 ou 2 mais ça afiche toujorus une chose bizarre !;

    Voici mon code qui bug bien !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    //*************lire et copier les avions********************************
     
     
    	FILE*lireavion = (FILE*)NULL;
    	//char line [LINELENGH];
    	lireavion = fopen("FichierAvion.csv", "r");
    	if (!lireaeroports) {fprintf(stderr,"Le fichier FichierAvion.csv n'est pas dans la racine du répertoire.");exit(EXIT_FAILURE);}
    	i=0;
     
    // *********************lecture de la première ligne compagnie*****************
     
       //while(fgets(line,LINELENGH,lireavion)&&strcmp(line,";;;;;;;;;;;;;\n") && nbavion < MAX_AVION) 
    		fgets(line,LINELENGH,lireavion);
    	 	buffer = strdup (line);
     
    		if (buffer == NULL)
    		{
    			fprintf(stderr,"Problème d'allocation mémoire.");
    			fclose(lireaeroports);
    			exit(EXIT_FAILURE);
    		}
    		pcourant = strtok(buffer, separateur);
    		for (nbavion=0; pcourant != NULL && nbavion<MAX_AVION; nbavion++)
    			{
     
    				if (pcourant != NULL)
    					strncpy(listeavion[i].compagnie, pcourant, 49);
     
    				else
    					{
    						fprintf(stderr,"La ligne %s du fichier FichierAvion.csv n'est pas correcte.", line);
    						free(buffer);
    						break;
    					}pcourant = strtok(NULL, separateur);
     
    			}free(buffer);
     
     
    // *********************lecture de la 2 ligne nom*****************
     
    		fgets(line,LINELENGH,lireavion);
    	 	buffer = strdup (line);
     
    		if (buffer == NULL)
    		{
    			fprintf(stderr,"Problème d'allocation mémoire.");
    			fclose(lireaeroports);
    			exit(EXIT_FAILURE);
    		}
    		pcourant = strtok(buffer, separateur);
    		for (nbavion=0; pcourant != NULL && nbavion<MAX_AVION; nbavion++)
    			{
     
    				if (pcourant != NULL)
    					strncpy(listeavion[i].nom, pcourant, 49);
     
    				else
    					{
    						fprintf(stderr,"La ligne %s du fichier FichierAvion.csv n'est pas correcte.", line);
    						free(buffer);
    						break;
    					}pcourant = strtok(NULL, separateur);
     
    			}free(buffer);
     
    // *********************lecture de la 3 ligne nbrpass*****************
     
    		fgets(line,LINELENGH,lireavion);
    	 	buffer = strdup (line);
     
    		if (buffer == NULL)
    		{
    			fprintf(stderr,"Problème d'allocation mémoire.");
    			fclose(lireaeroports);
    			exit(EXIT_FAILURE);
    		}
    		pcourant = strtok(buffer, separateur);
    		for (nbavion=0; pcourant != NULL && nbavion<MAX_AVION; nbavion++)
    			{
     
    				if (pcourant != NULL)
    					listeavion[i].nbrpass=*pcourant;
     
    				else
    					{
    						fprintf(stderr,"La ligne %s du fichier FichierAvion.csv n'est pas correcte.", line);
    						free(buffer);
    						break;
    					}
    			pcourant = strtok(NULL, separateur);
     
    			}free(buffer);
     
    // *********************lecture de la 4 ligne envergure*****************
     
    		fgets(line,LINELENGH,lireavion);
    	 	buffer = strdup (line);
     
    		if (buffer == NULL)
    		{
    			fprintf(stderr,"Problème d'allocation mémoire.");
    			fclose(lireavion);
    			exit(EXIT_FAILURE);
    		}
    		pcourant = strtok(buffer, separateur);
    		for (nbavion=0; pcourant != NULL && nbavion<MAX_AVION; nbavion++)
    			{
     
    				if (pcourant != NULL)
    					listeavion[i].envergure=*pcourant;
     
    				else
    					{
    						fprintf(stderr,"La ligne %s du fichier FichierAvion.csv n'est pas correcte.", line);
    						free(buffer);
    						break;
    					}pcourant = strtok(NULL, separateur);
     
    			}free(buffer);
     
     
    	fclose(lireavion);
     
    	for(i=0; i < nbavion; i++)
    		printf("les compagnies sont : avion numéro %i : %d \n", i, listeavion[1].nbrpass);
    	//puts(listeavion[i].compagnie);
     
     
    	//return EXIT_SUCCESS;
     
    	return 0;
    }

  15. #15
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Tu as bien initialisé à zéro le tableau des vols ?
    (ça ne risque pas de fonctionner avec puts, printf est indispensable !).

  16. #16
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Suite aux MP, voici les corrections du code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include <stdlib.h>
     
    #include <locale.h>
     
     
    #define CELLLENGH 512
    #define LINELENGH 256
    #define MAX_AERO 512
    #define MAX_AVION 35
     
    int main (void)
    {
     
    //float mach=0,range=0,nbpass=0,massebagages=0;
     
    /*	printf("Quel mach de croisière ?\n");
    	scanf("%f", &mach);   // faire boucle pour revenir en arrière While "sur"..)
    	printf("Quelle distance franchissable ?\n");
    	scanf("%f", &range);
    	printf("Nombre de passager ?\n");
    	scanf("%f", &nbpass);
    	printf("poids des bagages à transporter?\n");
    	scanf("%f", &massebagages);*/
    // voulez vous recommencez la saisie ?
     
    	int i=0;
     
     
     
    // **********************definition des stuctures **********	
    	struct AEROPORT
    		{ char nompays[50];char nomville[50];char nomaeroport[50]; int longueur; } ;
    	struct AEROPORT listeaeroport[MAX_AERO];
        int nbaero = 0;
     
    	struct AVION
    	{ 
    		char compagnie[50];
    		char nom[50];
    		int nbrpass; 
    		double envergure; 
    		double surfacevoilure; 
    		double masseZWF; 
    		double MTOW; 
    		double MaxFuelWeigh; 
    		double PayloadWithMaxFuel; 
    		double altitude; 
    		double range; 
    		double mach; 
    		double longueurdecolage; 
    		double longueuratterrisage; 
    		double consospecifique; 
    		double prix; 
    	} ;
    	struct AVION listeavion[MAX_AVION];
    	int nbavion = 0;
     
     
     
    //********************lecture et copie aéroport****************
     
    	FILE*lireaeroports = (FILE*)NULL;
    	FILE *lireavion = (FILE*)NULL;
    	char line [LINELENGH]; char cellule [CELLLENGH];
     
    	char *separateur = { ";" };
    	char *pcourant;
    	char *buffer;
     
    	// pour lire le fichier en conformité avec les habitudes françaises  (nombres décimaux avec ,
    	setlocale( LC_ALL, "French" );
     
     
    	lireaeroports = fopen("FichierAeroport.csv", "r");
    	if (!lireaeroports) 
    	{
    		fprintf(stderr,"Le fichier FichierAeroport.csv n'est pas dans la racine du répertoire.");
    		exit(EXIT_FAILURE);
    	}
     
    	while(fgets(line,LINELENGH,lireaeroports)&&strcmp(line,";;;\n") && nbaero < MAX_AERO) 
    	{ 
    		buffer = strdup (line);
     
    		if (buffer == NULL)
    		{
    			fprintf(stderr,"Problème d'allocation mémoire.");
    			fclose(lireaeroports);
    			exit(EXIT_FAILURE);
    		}
     
    		pcourant = strtok(buffer, separateur);
     
    		if (pcourant != NULL)
    			strncpy(listeaeroport[nbaero].nompays, pcourant, 49);
    		else
    		{
    			fprintf(stderr,"La ligne %s du fichier FichierAeroport.csv n'est pas correcte.", line);
    			free(buffer);
    			break;
    		}
     
    		// recherche de la ville
    		pcourant = strtok(NULL, separateur);
    		if (pcourant != NULL)
    			strncpy(listeaeroport[nbaero].nomville, pcourant,49);
    		else
    		{
    			fprintf(stderr,"La ligne %s du fichier FichierAeroport.csv n'est pas correcte.", line);
    			free(buffer);
    			break;
    		}
     
    		// recherche du nom de l'aeroport
    		pcourant = strtok(NULL, separateur);
    		if (pcourant != NULL)
    			strncpy(listeaeroport[nbaero].nomaeroport, pcourant,49);
    		else
    		{
    			fprintf(stderr,"La ligne %s du fichier FichierAeroport.csv n'est pas correcte.", line);
    			free(buffer);
    			break;
    		}
     
    		// recherche de la longueur de la piste
    		pcourant = strtok(NULL, separateur);
    		if (pcourant != NULL)
    			listeaeroport[nbaero].longueur = strtol(pcourant, NULL, 10);
    		else
    		{
    			fprintf(stderr,"La ligne %s du fichier FichierAeroport.csv n'est pas correcte.", line);
    			free(buffer);
    			break;
    		}
     
    		// il faut libérer la mémoire allouée par strdup
    		free(buffer);
    		nbaero++;
    	}
    	fclose(lireaeroports);
     
    	// on affiche les résultats pour verifier si c'est bien stocker dans la structure...
    	printf("Pays\t\tVille\t\tAéroport\t\tDistance\n");
    	for(i=0; i < nbaero; i++)
    		printf("%s\t\t%s\t\t%s\t\t%d\n", listeaeroport[i].nompays, listeaeroport[i].nomville,listeaeroport[i].nomaeroport, listeaeroport[i].longueur);
     
    	//return EXIT_SUCCESS;
     
     
    //*************lire et copier les avions********************************
     
     
     
    	lireavion = fopen("FichierAvion.csv", "r");
    	if (!lireaeroports) {
    		fprintf(stderr,"Le fichier FichierAvion.csv n'est pas dans la racine du répertoire.");
    		exit(EXIT_FAILURE);
    	}
    	i=0;
     
    // *********************lecture de la première ligne compagnie*****************
     
    		fgets(line,LINELENGH,lireavion);
    	 	buffer = strdup (line);
     
    		if (buffer == NULL)
    		{
    			fprintf(stderr,"Problème d'allocation mémoire.");
    			fclose(lireaeroports);
    			exit(EXIT_FAILURE);
    		}
    		pcourant = strtok(buffer, separateur);
    		// il faut sauter le premier nom qui décrit la ligne lue !
    		pcourant = strtok(NULL, separateur);
    		for (nbavion=0; pcourant != NULL && nbavion<MAX_AVION; nbavion++)
    			{
     
    				if (pcourant != NULL)
    					strncpy(listeavion[nbavion].compagnie, pcourant, 49);
     
    				else
    					{
    						fprintf(stderr,"La ligne %s du fichier FichierAvion.csv n'est pas correcte.", line);
    						free(buffer);
    						break;
    					}pcourant = strtok(NULL, separateur);
     
    			}free(buffer);
     
     
    // *********************lecture de la 2 ligne nom*****************
     
    		fgets(line,LINELENGH,lireavion);
    	 	buffer = strdup (line);
     
    		if (buffer == NULL)
    		{
    			fprintf(stderr,"Problème d'allocation mémoire.");
    			fclose(lireaeroports);
    			exit(EXIT_FAILURE);
    		}
    		pcourant = strtok(buffer, separateur);
    		pcourant = strtok(NULL, separateur);
    		for (i=0; pcourant != NULL && i<nbavion; i++)
    			{
     
    				if (pcourant != NULL)
    					strncpy(listeavion[i].nom, pcourant, 49);
     
    				else
    					{
    						fprintf(stderr,"La ligne %s du fichier FichierAvion.csv n'est pas correcte.", line);
    						free(buffer);
    						break;
    					}pcourant = strtok(NULL, separateur);
     
    			}free(buffer);
     
    // *********************lecture de la 3 ligne nbrpass*****************
     
    		fgets(line,LINELENGH,lireavion);
    	 	buffer = strdup (line);
     
    		if (buffer == NULL)
    		{
    			fprintf(stderr,"Problème d'allocation mémoire.");
    			fclose(lireaeroports);
    			exit(EXIT_FAILURE);
    		}
    		pcourant = strtok(buffer, separateur);
    		pcourant = strtok(NULL, separateur);
    		for (i=0; pcourant != NULL && i<nbavion; i++)
    			{
     
    				if (pcourant != NULL)
    					listeavion[i].nbrpass=strtol(pcourant, NULL, 10);  // pas de pb içi ?
     
    				else
    					{
    						fprintf(stderr,"La ligne %s du fichier FichierAvion.csv n'est pas correcte.", line);
    						free(buffer);
    						break;
    					}
    			pcourant = strtok(NULL, separateur);
     
    			}free(buffer);
     
    // *********************lecture de la 4 ligne envergure*****************
     
    		fgets(line,LINELENGH,lireavion);
    	 	buffer = strdup (line);
     
    		if (buffer == NULL)
    		{
    			fprintf(stderr,"Problème d'allocation mémoire.");
    			fclose(lireavion);
    			exit(EXIT_FAILURE);
    		}
    		pcourant = strtok(buffer, separateur);
    		pcourant = strtok(NULL, separateur);
    		for (i=0; pcourant != NULL && i<nbavion; i++)
    		{
     
    				if (pcourant != NULL)
    					listeavion[i].envergure= strtod(pcourant, NULL);
     
    				else
    					{
    						fprintf(stderr,"La ligne %s du fichier FichierAvion.csv n'est pas correcte.", line);
    						free(buffer);
    						break;
    					}
    				pcourant = strtok(NULL, separateur);
     
    		}
    		free(buffer);
     
     
    	fclose(lireavion);
     
    	for(i=0; i < nbavion; i++)
    		printf("Nombre de passagers : avion numero %i : %d \n", i, listeavion[i].nbrpass);
     
    	for(i=0; i < nbavion; i++)
    		printf("Envergure: avion numero %i : %.2lf \n", i, listeavion[i].envergure);
    	//puts(listeavion[i].compagnie);
     
     
    	//return EXIT_SUCCESS;
     
    	return 0;
    }
    Bonne lecture.

  17. #17
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 27
    Points : 6
    Points
    6
    Par défaut
    Merci infiniment, j'ai tout compris.

    notament, les problèmes de convertions de format dont j'imaginais pas l'existence !

    (i.e se servir de strtod et strtol etc...)

    setlocale( LC_ALL, "French" ) ?

    ça permet de comprendre que le repère pour les décimales est , et non . ?

  18. #18
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par gdlbb
    ça permet de comprendre que le repère pour les décimales est , et non . ?
    Oui.

  19. #19
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 27
    Points : 6
    Points
    6
    Par défaut
    Tiens, j'ai un soucis avec les esapce !

    il interprete bien "8,562" come "8.562" ---> Ok
    il interpret "58555" comme "58555" -----> Ok
    mais "58 555" il le prends comme 58,555--> NON il devrais coller de 58 et 555

    je vais essayer de résoudre le pb !
    je pourrais peute tre supprimer les espaces..

    et puis, j'ai un soucis dans l'affichage des virgule.

    avec ça, il devrais m'afficher les décimale non ?

    je pesne que j'ai bien stocker les virgule car strtod convertir la chaine en double, pas comme strtol on long entier, donc ça devrasi bien garder les décimale ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	for(i=0; i < nbavion; i++)
    		printf("Envergure: avion numero %i : %.4lf \n", i, listeavion[i].envergure);

  20. #20
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par gdlbb
    Tiens, j'ai un soucis avec les esapce !

    il interprete bien "8,562" come "8.562" ---> Ok
    il interpret "58555" comme "58555" -----> Ok
    mais "58 555" il le prends comme 58,555--> NON il devrais coller de 58 et 555
    Je ne sais pas si scanf() sait faire ça...

    et puis, j'ai un soucis dans l'affichage des virgule.

    avec ça, il devrais m'afficher les décimale non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	for(i=0; i < nbavion; i++)
    		printf("Envergure: avion numero %i : %.4lf \n", i, listeavion[i].envergure);
    Si listeavion[i].envergure est un double, oui.

    Pour convertir "US$123.456"

    Tu vérifie a présence du "US$" avec strstr(). Si il est présent, tu passes l'adresse du premier chiffre à strtod(), qui est = +3 de la position de "US$" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       double prix;
       char champ[] = "US$123.456"
       char *p = strstr(champ, "US$");
     
       if (p != NULL)
       {
          prix = strtod (p + 3, NULL);
       }
       else
       {
          prix = strtod (champ, NULL);
       }
    Que l'on peut optimiser en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
       double prix;
       char champ[] = "US$123.456"
       char *p = strstr(champ, "US$");
     
       if (p != NULL)
       {
          p += 3;
       }
       else
       {
          p = champ;
       }
       prix = strtod (p, NULL);
    mais c'est déjà un peu plus ésotérique...

Discussions similaires

  1. Figer des lignes et des colonnes dans un tableau
    Par Opo dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 15/11/2006, 16h10
  2. [HTML] Pb pour inserer une colonne dans un tableau
    Par cchampion2fr dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 11/11/2006, 11h41
  3. [Visual Web] [SJSC] Ajout de colonne dans un tableau
    Par vincent77320 dans le forum NetBeans
    Réponses: 4
    Dernier message: 12/06/2006, 11h44
  4. Masquer des colonnes dans un tableau
    Par fornorst dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 26/04/2006, 21h00
  5. Import de fichier CSV automatique dans Access
    Par Jmar dans le forum Access
    Réponses: 4
    Dernier message: 20/01/2006, 10h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo