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 :

Nommer fichier de sortie en foncton des arguments d'entrée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 11
    Par défaut Nommer fichier de sortie en foncton des arguments d'entrée
    Bonjour,

    supposons un programme "file_name.cpp":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main()
    {
      FILE * p_file;
      p_file = fopen( "output.txt" , "w" );
      fprintf( p_file, "Hello World !\n" );
      fclose (p_file );
    }
    Maintenant, je désire ajouter:
    int a = 2;
    et que le fichier de sortie s'appelle output_2.txt
    cad en fonction de la valeur de a

    un peu comme le printf: ("output_%i.txt", a)

    mais ça ne marche pas avec le fopen()...

    l'un d'entre vous aurait-il un conseil ?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Salut et bienvenue sur les forums de developper.com


    En fait, c'est facile, il faut d'abord construire une chaîne contenant le nom du fichier avec le numéro, ce que tu peux faire avec la fonction sprintf ... Voilà !

    Pour info, test toujours le retour de fopen pour le cas où la création ou l'ouverture du fichier échouerais et aussi, les fichiers source en C on l'extension .c et non pas .cpp qui est pour le C++ !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 11
    Par défaut
    merci pour la réponse !
    mais je n'rrive pas à utiliser sprintf (malgré la page du manuel)

    Voilà ce que j'écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      int a = 5;
      FILE * p_file;
      char * file_name;
      sprintf( file_name, "output_%i.txt", a );
      p_file = fopen( file_name , "w" );
      fprintf( p_file, "Hello World !\n" );
      fclose ( p_file );
    ça compile bien avec: gcc -o file_name file_name.c
    mais après ./file_name
    ça me renvoie Segmentation Fault

    et sinon, o`u pourrai-je trouver des infos pour le test de fopen ?

  4. #4
    Expert éminent
    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
    Par défaut
    Citation Envoyé par walrus_55
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      int a = 5;
      char * file_name;
      sprintf( file_name, "output_%i.txt", a );
    ça compile bien avec: gcc -o file_name file_name.c
    Euh, non...

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

    mais après ./file_name
    ça me renvoie Segmentation Fault
    Ce n'est pas étonnant. Tu définis un pointeur non initialisé et tu passes sa valeur à une fonction. Le comportement est donc indéterminé.

    Il faut passer une valeur valide. Le plus simple, ici, est de passer l'adresse du premier élément d'un tableau de char.

  5. #5
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 11
    Par défaut
    alors j'ai un peu arrangé le code selon vos conseils et ça donne ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      int a = 10;
      char s[] = "output_.txt";
      char *file_name = &s;
      sprintf( file_name, "output_%i.txt", a );
      FILE * p_file;
      p_file = fopen( file_name , "w" );
      fprintf( p_file, "Hello World !\n" );
      fclose ( p_file );
    mais quand je compile avec: "gcc -o file_name file_name.c"
    ça me donne: "warning: initialization from incompatible pointer type"
    pour la ligne "char *file_name = &s;"
    mais ça compile quand même
    et quand j'exécute avec "./file_name"
    ça crée bien le fichier "output_10.txt"

    donc je ne comprends pas le warning à propos du "incompatible pointer type"...

  6. #6
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 11
    Par défaut
    ça y est, j'ai compris
    il faut préciser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *file_name = &s[0];
    pour initialiser le pointeur

    donc, c'est bon, c'est résolu.
    Merci

  7. #7
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char s[] = "output_.txt";
    char *file_name = &s;
    1) -> char *file_name = s me parait plus logique
    2) à quoi sert de faire une chaine et de déclarer un pointeur dessus ?

    Je propose:

    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
     
    #include <stdio.h>
     
    #define C_MAX 128
     
    void main(void)
    {
      int a = 10;
      char file_name[C_MAX];
     
      FILE * p_file;
      sprintf( file_name, "output_%i.txt", a );
      p_file = fopen( file_name , "w" );
      if (p_file != NULL)
      {
    	fprintf( p_file, "Hello World !\n" );
    	fclose ( p_file );
      }
    }
    La valeur de fopen est testé. Il y a un limitation dans le nombre de digits du à la taille de file_name, mais je suis optimiste

    Ceci n'est pas testé...

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

Discussions similaires

  1. Passer des arguments en entrée à une application
    Par pcouas dans le forum Android
    Réponses: 3
    Dernier message: 29/01/2015, 13h02
  2. [Compiler] Comment passer des arguments d'entrée et de sortie ?
    Par nahouto dans le forum MATLAB
    Réponses: 5
    Dernier message: 08/07/2009, 15h00
  3. Réponses: 3
    Dernier message: 22/01/2009, 15h11
  4. Réponses: 1
    Dernier message: 23/07/2007, 11h00
  5. Réponses: 10
    Dernier message: 16/06/2007, 16h07

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