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 :

Gestion des fichiers


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 70
    Points : 34
    Points
    34
    Par défaut Gestion des fichiers
    Bonjour,

    Mes questions sont simples. Pour créer un fichier, j'utilise actuellement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          FILE *fichier;
          fichier = fopen("image.ppm","w");
    J'aimerais être capable de faire 2 choses :

    1) Mettre mes fonctions de création de fichier à l'intérieur d'un while(1) et, à la ième itération, créer un imagei.ppm (image1.ppm image2.ppm ...) de sorte que les fichiers images ne s'écrasent pas les uns les autres.

    2) Mon but, c'est de ne pas supprimer les images du répertoire courant, même lorsque je relance le programme. Si j'ai déjà 10 fichiers image1.ppm à image10.ppm dans le répertoire, je ne veux pas les écraser mais reprendre la création des images à image11.ppm.

    Voila, j'espère que c'est assez clair. D'avance merci 8)

  2. #2
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 370
    Points : 40 164
    Points
    40 164
    Par défaut
    Bien le bonjour,

    et qu'est-ce qui te pose problème ?

    générer des noms de fichiers en fonction d'un compteur de boucle ?
    récupérer les fichiers déjà présents dans un répertoire ?

    Sois plus précis et montre-nous ce que tu as déjà fait

  3. #3
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    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
     
     
    #define MAX 1024
     
    int main(void) 
    {
        int i;
        FILE *f = NULL;
        char filename[1024];
        for(i = 0; i < MAX; i++) {
            memset(filename, 0, sizeof filename);
            sprintf(filename, "image%d", i);
            f = fopen(filename, "w");
            if(f == NULL) exit(EXIT_FAILURE);
            [...]
        }
        return 0;
    }
    Pour ton autre truc, tu fais pareil sauf que au lieu d'ouvrir le fichier en ecriture tu l'ouvres en lecture.

    Si f == NULL => fichier existe pas donc tu peux l'ouvrir en ecriture
    si f != NULL => fichier existe tu le fermes tu passes au suivant.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 70
    Points : 34
    Points
    34
    Par défaut
    OK Merci. A priori ce qui suit fonctionne, quelque chose à redire ? Je connais ni memset ni sprintf donc j'ai fais comme j'ai cru bon
    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
    int main(void) 
    { 
        int i=0; 
        FILE *f = NULL; 
        char filename[1024]; 
     
        while(1)
        {
                memset(filename, 0, sizeof filename); 
            sprintf(filename, "image%d", i); 
            f = fopen(filename, "r"); 
     
                      if(f != NULL) 
                           i++;
                      else break;
            } 
       while(1) { 
     memset(filename, 0, sizeof filename); 
            sprintf(filename, "image%d", i); 
            f = fopen(filename, "r"); 
     
            f = fopen(filename, "w"); 
            printf("image%d\n", i);
            i++;
            getch(); 
        } 
        return 0; 
    }

  5. #5
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par babar56
    OK Merci. A priori ce qui suit fonctionne, quelque chose à redire ? Je connais ni memset ni sprintf donc j'ai fais comme j'ai cru bon
    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
    int main(void) 
    { 
        int i=0; 
        FILE *f = NULL; 
        char filename[1024]; 
     
        while(1)
        {
                memset(filename, 0, sizeof filename); 
            sprintf(filename, "image%d", i); 
            f = fopen(filename, "r"); 
     
                      if(f != NULL) 
                           i++;
                      else break;
            } 
       while(1) { 
     memset(filename, 0, sizeof filename); 
            sprintf(filename, "image%d", i); 
            f = fopen(filename, "r"); 
     
            f = fopen(filename, "w"); 
            printf("image%d\n", i);
            i++;
            getch(); 
        } 
        return 0; 
    }
    Tu ne refermes pas les fichiers dans la premiere boucle

    Tu réouvres le fichier dans la 2eme boucle, alors que ca sert à rien, et tu ne le referme pas.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 70
    Points : 34
    Points
    34
    Par défaut
    Comme ça c'est mieux ?

    Une autre question : j'ignore à quoi servent int, void et return 0; (ceux en rapport à main) et à priori ça marche très bien sans, donc je peux les virer définitivement ? Si ça te vexe je les conserve mais bon 8)

    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
    int main(void) 
    { 
        int i=0; 
        FILE *f = NULL; 
        char filename[1024]; 
     
        while(1)
        {
                memset(filename, 0, sizeof filename); 
                sprintf(filename, "image%d", i); 
                f = fopen(filename, "r"); 
     
                if(f != NULL)
                {
                     fclose(f); 
                     i++;
                }
                else 
                     break;
            } 
       while(1)
       {
               memset(filename, 0, sizeof filename); 
               sprintf(filename, "image%d", i); 
     
               f = fopen(filename, "w"); 
               printf("image%d\n", i);
               // [...]
               fclose(f);
               i++;
               getch(); 
        } 
        return 0; 
    }

  7. #7
    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 : 68
    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 babar56
    Une autre question : j'ignore à quoi servent int, void et return 0; (ceux en rapport à main)
    http://emmanuel-delahaye.developpez....s.htm#typemain

  8. #8
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 70
    Points : 34
    Points
    34
    Par défaut
    Si j'ai bien compris, ça n'apporte ni plus ni moins au code.

    J'en profite pour glisser une autre question : comment puis-je lancer l'ouverture d'un fichier qui se trouve dans le dossier courant depuis mon programme ? J'ai entendu parler de la fonction system, est-ce la bonne ? Merci.

  9. #9
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par babar56
    Si j'ai bien compris, ça n'apporte ni plus ni moins au code.
    Non, cela fait partie de la norme. Il faut écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main(void)
    {
    return 0;
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main(int argc, char **argv)
    {
    return 0;
    }
    Sachant que 0 est le retour disant "tout s'est bien passé", aussi connu sous la macro EXIT_SUCCESS (du fichier stdlib.h)

    et 1 est le retour disant "erreur", aussi connu sous la macro EXIT_FAILURE (aussi dans le fichier stdlib.h)

    Ne pas les mettre est considéré comme une erreur (peut-être pas par un compilateur mais par beaucoup de programmeurs)

    J'en profite pour glisser une autre question : comment puis-je lancer l'ouverture d'un fichier qui se trouve dans le dossier courant depuis mon programme ? J'ai entendu parler de la fonction system, est-ce la bonne ? Merci.
    Devrait être une nouvelle question...

    Cela dépend comment tu veux l'ouvrir... Si c'est à partir d'un autre programme, alors oui, system est la solution. Si c'est pour le lire dans le programme, alors il faut utiliser les fonctions C.

    Jc

  10. #10
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Sachant que 0 est le retour disant "tout s'est bien passé", aussi connu sous la macro EXIT_SUCCESS (du fichier stdlib.h)

    et 1 est le retour disant "erreur", aussi connu sous la macro EXIT_FAILURE (aussi dans le fichier stdlib.h)
    Mieux vaut utiliser les constantes EXIT_SUCCESS et EXIT_FAILURE qui sont d'une part plus explicites, et d'autre part sure de faire ce que l'on veut. 0 et 1 ne sont pas normailisées et n'ont pas forcément les mêmes significations sur tous les systèmes (à ma connaissance, c'est toujours pareil mais cela m'étonnerait que ce soit le cas partout.)

  11. #11
    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 : 68
    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 fearyourself
    Sachant que 0 est le retour disant "tout s'est bien passé", aussi connu sous la macro EXIT_SUCCESS (du fichier stdlib.h)

    et 1 est le retour disant "erreur", aussi connu sous la macro EXIT_FAILURE (aussi dans le fichier stdlib.h)
    C'est pas tout à fait vrai.

    Les 3 valeurs portables pouvant être retournées au système (return de main() ou paramètre d exit()) sont
    • 0
    • EXIT_SUCCESS
    • EXIT_FAILURE

    D'autre part, la sémantique de 0 et de EXIT_SUCCESS ets la même (OK)
    La sémantique de EXIT_FAILURE est évidente (KO)

    Maintenant, en ce qui concerne la valeur qui est derrière les 2 macros, c'est simple, on ne sait pas et on a pas à le savoir.

    Le fait que ces valeurs soient postables font que le source pourra être compilé et exécité sans risque sur n'importe quel système.

    Celà ne signifie pas que l'on ai pas le droit de mettre d'autres valeurs. Simplement, il faut s'assurer qu'elles sont acceptées sans risque par le système.

    Par exemple, MS-DOS accepte les valeurs 0 à 255 et rien d'autre. Si on retourne -1 ou 256, le comportement est indéfini.

    Pour d'autres systèmes, 1 signifie OK et -1 signifie KO.

    Ca veut dire que si on code exit(0), le compilateur (ou la bibliothèque d'exécution peu importe) va revoyer 1 au système.

    etc.

Discussions similaires

  1. Gestion des fichiers
    Par riadhz dans le forum Windows
    Réponses: 1
    Dernier message: 24/08/2006, 10h36
  2. [VBA-E] gestion des fichiers ouverts ...
    Par SpaceFrog dans le forum Macros et VBA Excel
    Réponses: 24
    Dernier message: 20/01/2006, 18h10
  3. [FTP] Gestion des fichiers Online ?
    Par MaTHieU_ dans le forum Langage
    Réponses: 9
    Dernier message: 23/10/2005, 16h16
  4. Gestion des fichiers
    Par roger12 dans le forum Administration système
    Réponses: 2
    Dernier message: 19/10/2005, 10h01

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