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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 éprouvé
    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
    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
    Membre averti
    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
    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
    Membre averti
    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
    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 éprouvé
    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
    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 Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    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 : 872
    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
    Membre averti
    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
    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 : 241
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
    Membre averti
    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
    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 ?

+ 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