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 :

creation de fichier dans une boucle avec changement de nom


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    profession liberale
    Inscrit en
    Avril 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : profession liberale

    Informations forums :
    Inscription : Avril 2014
    Messages : 22
    Points : 9
    Points
    9
    Par défaut creation de fichier dans une boucle avec changement de nom
    bonjour,

    je m'explique, je programme avec Code::Blocks sur Windows 7 et 8

    j'aimerai enregistrer dans un fichier mes résultats mais ceux ci sont très nombreux et me retrouve avec des fichiers de plusieurs Go,
    je souhaite créer un compteur qui après n enregistrement crée un nouveau fichier pour les nouveaux enregistrements et ainsi de suite fonction du nombre d'

    ex fichier1.txt, fichier2.txt...,

    est il possible de créer ce genre de nom, le numéro serait une variable...

    j'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fopen("fichier%d.txt", i, "a+");
    mais cela ne marche pas...

    la solution simple serait de créer par exemple 10 fichiers à l'avance et de les remplir ensuite mais j'espère que l'on peut faire autrement...

    merci à vous

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 62
    Points : 162
    Points
    162
    Par défaut
    Bonjour, chris6700
    Pourquoi n'écris tu pas ton nom de fichier dans une chaîne de caractère via la commande sprintf que tu passes ensuite à ton fopen ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    profession liberale
    Inscrit en
    Avril 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : profession liberale

    Informations forums :
    Inscription : Avril 2014
    Messages : 22
    Points : 9
    Points
    9
    Par défaut bien vu
    bonjour,

    merci beaucoup, effectivement mon essai avec ta proposition fonctionne, je n'ai pas encore l'habitude.... mais je pense que maintenant j'y penserai
    merci encore

  4. #4
    Futur Membre du Club
    Homme Profil pro
    profession liberale
    Inscrit en
    Avril 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : profession liberale

    Informations forums :
    Inscription : Avril 2014
    Messages : 22
    Points : 9
    Points
    9
    Par défaut le nom de fichier apparait dans le fichier.txt apres creation avec sprintf
    bonjour,

    voici mon programme de création de mot

    comme le nb de résultat est fonction du nb d'éléments cela peut être très volumineux,

    je crée donc un fichier à chaque fois que le nombre de valeur atteint un certain seuil défini

    la fonction sprintf m'a été suggéré, elle m'a permis de faire ce que je voulais mais après ouverture desdits fichiers, dans cet exemple je retrouve le nom de mon fichier dans la première ligne
    exemple : pour le fichier dico1.txt, après ouverture il apparait à la première ligne au milieu de mes résultats ??? pourtant il ne s'agit de pas de "mot" (variable tableau de char dans mon prog)
    nomFichier="dico1.txt" //cela donne le nom de mon fichier
    fputs(mot, dico) //ici je demande bien à mot de s'écrire DANS le fichier

    savez vous au regard de mon prog, voir en dessous, ce qui ne va pas...
    merci d'avance



    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    #include <math.h>
     
    #define NB_D_ELEMENTS 5
    #define NB_DE_POSSIBILITE pow(26,NB_D_ELEMENTS)*2
    #define NB_DE_MOTS_PAR_LIGNE 15
    #define NB_DE_MOTS_PAR_FICHIER 1000000
    #define NB_D_ELEMENTS_ALPHABET 26
     
     
    int main(int argc, char* argv[])
    {
        int i;
        int j=NB_DE_POSSIBILITE;
        int compteur=0;
     
        FILE* dico=NULL;
     
        char nomFichier[11]="dico.txt";
     
        srand (time(NULL));
        char mot[NB_D_ELEMENTS]="\0";
        char alphabet[27]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
     
        int numeroFichier=0;
     
     
        do{
            for (i=0;i<NB_D_ELEMENTS;i++)
            {
                int nbAleatoire = (rand() % NB_D_ELEMENTS_ALPHABET);
                mot [i]= alphabet[nbAleatoire];
            }
            compteur++;
            mot[NB_D_ELEMENTS]='\0';
     
            if(!(compteur%NB_DE_MOTS_PAR_FICHIER)||compteur==1)
            {
                numeroFichier++;
                sprintf(nomFichier, "dico%d.txt", numeroFichier);
                dico=fopen(nomFichier,"a+");
            }
     
            fputs(mot, dico);
            fputs("   ", dico);
            if (!(compteur%NB_DE_MOTS_PAR_LIGNE))
                fputc('\n',dico);
        }while (j--);
     
        fclose(dico);
     
    }

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 62
    Points : 162
    Points
    162
    Par défaut
    Bonjour,
    J'ai pas mal cherché et je ne vois pas de problème.
    J'ai ensuite compilé et exécuté ton code et il n'y a toujours pas de problème.
    Un petit coup de grep dico me donne les lignes avec des mots comportant dico mais pas de nom de fichier complet.

    Je ne sais pas si tu en es conscient mais ton fclose ne ferme que le dernier descripteur de fichier. Tu laisses tout les autres ouverts.

  6. #6
    Membre chevronné
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 853
    Points : 2 167
    Points
    2 167
    Par défaut
    Tu fais de l'ecrasement de donnees avec tes tableaux, exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char mot[NB_D_ELEMENTS]="\0"; /* pas tip top ca d'ailleurs, mieux vaut ecrire ca :
    char mot[NB_D_ELEMENTS] = ""; */
     
    mot[NB_D_ELEMENTS]='\0';
    Ici tu ecris donc dans la case 6 de ton tableau qui fait 5 cases. Resutat : tu ecris dans un espace qui n'est pas alloue a ce tableau.

    Prends l'habitude d'utiliser snprintf plutot que sprintf, ca evite des erreurs inattendues et faciles a eviter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char alphabet[27]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    Pourquoi pas plutot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
    ?

    Quand on ouvre un fichier (avec fopen ou open, qu'importe) il est important de bien verifier que sa creation s'est bien deroulee. Dans ton cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dico=fopen(nomFichier,"a+");
    if (dico == NULL) {
      //gerer l'erreur ici
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if(!(compteur%NB_DE_MOTS_PAR_FICHIER)||compteur==1)
    {
        numeroFichier++;
        sprintf(nomFichier, "dico%d.txt", numeroFichier);
        dico=fopen(nomFichier,"a+");
    }
    Ce bout de code me semble inutilement complique et je pense que ton probleme vient de la.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    profession liberale
    Inscrit en
    Avril 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : profession liberale

    Informations forums :
    Inscription : Avril 2014
    Messages : 22
    Points : 9
    Points
    9
    Par défaut peux tu apporter ta touche au morceau compliqué
    j'ai fais les modifications que tu proposes, effectivement cela simplifie...

    voici une copie d'ecran de ce qui me gêne...

    Nom : visuel.jpg
Affichages : 233
Taille : 228,9 Ko

    en haut à gauche...

    pour le morceau de code compliqué, comme puis je initier la création de fichier numéroté proprement

    ensuite une dernière question

    comment fermé tous les fichiers ouverts en même temps ?

    merci

  8. #8
    Futur Membre du Club
    Homme Profil pro
    profession liberale
    Inscrit en
    Avril 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : profession liberale

    Informations forums :
    Inscription : Avril 2014
    Messages : 22
    Points : 9
    Points
    9
    Par défaut une avancée
    suite

    j'ai modifié mon code comme Imperio me l'a conseillé, j'ai simplement rajouté la verif if (dico==NULL)exit(0);

    et plus de nom de fichier écrit dans mon fichier

    juste un problème de formatage (lié à mes modulos qui ne tombent pas juste avec mon nombre de colonne)

    voilà,

    plus qu'une question COMMENT FERME T ON plusieurs fichiers ouvert d'un coup, est ce possible sans boucle ?

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 62
    Points : 162
    Points
    162
    Par défaut
    Donc le problème du nom de fichier venait d'où ?

    Je ne croit pas que tu puisses fermer plusieurs fichiers d'un coup , en tout cas pas avec fclose. Le mieux serait de libérer un fichier juste avant d'ouvrir le suivant, ainsi tu libère la ressource dès que tu n'en à plus besoin et tu n'as pas besoin de faire une boucle supplémentaire.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    profession liberale
    Inscrit en
    Avril 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : profession liberale

    Informations forums :
    Inscription : Avril 2014
    Messages : 22
    Points : 9
    Points
    9
    Par défaut ben en fait je n'en sait rien
    j'ai juste rajouté le contrôle d'ouverture du fichier et à tout hasard j'ai recompilé et hop plus de nom de fichier écrit dedans...

    je ne peux t'en dire plus...

    si quelqu'un comprend !!!

    en ce qui concerne le fclose, merci pour ton idée, je l'ai rajouté dès le début de mon if

    je commence donc par fermer un fichier dico et ensuite j'en ouvre un, je dirai que ce 'est pas catholique de fermer avant d'ouvrir mais ça ne bug pas et au final mon dernier fclose en fin de programme ferme le dernier fichier ouvert

    autrement où le placer ?

    merci à tous vous m'aider à avancer, des fois c'est bête, mais faut y penser...

  11. #11
    Membre chevronné
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 853
    Points : 2 167
    Points
    2 167
    Par défaut
    Tu peux utiliser fclose au debut de ta boucle si tu veux avec pour condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FILE *dico = NULL;
     
    if (dico != NULL)
      fclose(dico);
    Le but etant de bien fermer correctement tous tes file descriptor (c'est plus propre).

    Citation Envoyé par chris6700
    j'ai juste rajouté le contrôle d'ouverture du fichier et à tout hasard j'ai recompilé et hop plus de nom de fichier écrit dedans...
    C'est sans doute parce qu'en ecrivant dans tes divers tableaux tu devais ecraser le '\0' d'un autre. Du coup la fonction allait aussi lire le suivant. Les erreurs les plus incomprehensibles viennent souvent de petites erreurs.

  12. #12
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 62
    Points : 162
    Points
    162
    Par défaut
    Citation Envoyé par imperio Voir le message
    C'est sans doute parce qu'en ecrivant dans tes divers tableaux tu devais ecraser le '\0' d'un autre. Du coup la fonction allait aussi lire le suivant. .
    Oui c'est la raison la plus probable et ça concorde avec le fait que je n'ai pas eu le problème en testant le code : N'étant pas sous le même OS l'organisation de l'allocation n'est pas la même. Néanmoins, ça n'explique pas pourquoi ce problème n'arrive qu'une fois en début de fichier. Avec son code, si il y avait un tel problème, le nom du fichier apparaîtrait à chaque fois

    Bref c'est de la magie noire!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/07/2014, 13h09
  2. Tri dans une boucle avec numéros
    Par delavega dans le forum ASP
    Réponses: 1
    Dernier message: 24/11/2006, 13h17
  3. Réponses: 4
    Dernier message: 15/06/2006, 10h05
  4. Renommer un fichier dans une boucle
    Par Thomas Carrere dans le forum C
    Réponses: 5
    Dernier message: 05/05/2006, 18h20
  5. [forms 6i] charger un fichier dans une table avec sqlloader
    Par moneyinthebank dans le forum SQL*Loader
    Réponses: 8
    Dernier message: 29/04/2006, 01h15

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