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 :

Probleme pendant l'écriture du fichier


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2021
    Messages : 58
    Points : 52
    Points
    52
    Par défaut Probleme pendant l'écriture du fichier
    Bonjour Madame, Monsieur,

    Pour un projet je dois créer un système de management de banque. Pour cela je veux créer un fichier où on peut enregistrer les noms. Mon programmation reste très basique. Dès que j'essaie d'enregistrer sur le fichier cela pose problème.Pouvez vous corriger le problème? Merci
    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
     # include <stdlib.h>
    # include <stdio.h>
    # include <tgmath.h>
    # define  NB_ELEM
     
     
    void affichage(int n , float x[n]){  // initialisation de tableau 
      int i;
        for(i = 0;i<n; i++){
        x[i]=0;
        printf(" la valeurs de x[%d] = %f\n",i,x[i]);
        };
        return;
    };
     
     
    void changer_fichier(int N2, float x1[NB_ELEM]){  // création de fichier 
      FILE *fp;
      int i = 0;
     
      fp = fopen("/media/Tonny/TOSHIBA EXT/programmation_c/exercice1/test1.txt","w");
      if (fp = NULL){
        printf("le fichier n'existe pas ");
      };
     
      for(i = 0; i<N2; i++){
      fprintf(fp,"%f", x1[i]);
      };
      return;
    };
     
     
     
    int main (void){
      int n,i;
      n  = 0;
      i = 0;
      printf ("saisir une valeur");
      scanf("%d",&n);
      printf("valeur saisi est égale : %d", n);
      float x1[n];
      float x2[n];
     
     
      for(i = 0; i<n;i++){
        x2[i]=0;
      };
     
      printf("%f",x2[n]);
      affichage(n,x1);  
      changer_fichier(n,x2); // enregistrer dans le fichier 
     
     
     
      exit(EXIT_SUCCESS);
     
    };
    erreur :
    valeur saisi est égale : 10 la valeurs de x[0] = 0.000000
    la valeurs de x[1] = 0.000000
    la valeurs de x[2] = 0.000000
    la valeurs de x[3] = 0.000000
    la valeurs de x[4] = 0.000000
    la valeurs de x[5] = 0.000000
    la valeurs de x[6] = 0.000000
    la valeurs de x[7] = 0.000000
    la valeurs de x[8] = 0.000000
    la valeurs de x[9] = 0.000000

    Erreur de segmentation (core dumped)

  2. #2
    Membre éclairé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2015
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Septembre 2015
    Messages : 204
    Points : 839
    Points
    839
    Par défaut
    bonjour


    => tu ne définies pas la valeur
    alors quand il arrive à


    les "return" dans les void ne sont pas nécessaires


    je n'ai pas regardé plus loin s'il y avait d'autres erreurs

  3. #3
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    ligne 49, tu écris printf("%f",x2[n]);. A cet instant combien vaut n selon toi? Le programme pourtant ne plante pas ici.
    mais le problème est ligne 22. Le compilateur as-tu d'avertir. Tu écris if (fp = NULL), c'est un test il faut mettre un double égal ==.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par tuba uba Voir le message
    Pouvez vous corriger le problème? Merci
    On peut te dire où sont les problèmes, à toi de les corriger.
    Donc float x[n] dans les paramètres des fonctions (valeur de n ???). Ecrire x[i]=0 juste avant de l'afficher... Ta fonction "affichage" a pour commentaire "initialisation" ??? Et tu testes si fp vaut NULL (en fait c'est pas un test comme le dit dalfab mais une affectaion) mais s'il vaut NULL tu continues quand-même à remplir un fichier qui n'a pas été ouvert.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2021
    Messages : 58
    Points : 52
    Points
    52
    Par défaut
    Merci pour aide rapide. Vous avez raison c'est affectation qui était responsable du message erreur. Même si je n'arrive pas remplir comme je le souhaite le fichier texte. Au moins les erreurs ont été corrigé. Je vais continuer à améliorer mon programme. Pour ce qu'est la valeur de n, j'ai toujours pris n=10. Ce qui m'a dérouter un peu c'est quand je compilait,il n'y avait pas erreur. C'est au moment exécution j'ai eu cette erreur.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tuba uba Voir le message
    Pour ce qu'est la valeur de n, j'ai toujours pris n=10.
    Il te faut revoir les notions de visibilité des variables. Une variable n située dans un bloc A ne sera pas la même chose qu'une variable n située dans un bloc B. De plus un tableau float x[n] en tant que paramètre (alors que n n'existe pas) je n'arrive même pas à comprendre comment ça compile et ce que le compilateur peut y comprendre (peut-être y voit-il un VLA?). Idem pour le #define NB_ELEM sans valeur (ceci dit essayer d'afficher ensuite NB_ELEM d'une quelconque façon entraine une erreur de compilation).

    Citation Envoyé par tuba uba Voir le message
    Ce qui m'a dérouté un peu c'est quand je compilait,il n'y avait pas erreur. C'est au moment exécution j'ai eu cette erreur.
    La compilation c'est juste une traduction de syntaxe. Elle ne remplacera pas la réflexion. Si tu écris dans une syntaxe correcte un algo incorrect, ça compilera. Et en plus le compilateur ne te préviendra même pas si tu dépasses les limites (exemple si tu tapes dans l'indice 15 d'un tableau de 10 éléments) car la philisophie du C c'est "pour aller le plus vite possible je ne vérifie rien, c'est au programmeur de vérifier ce qu'il fait" (enfin les compilos modernes avec les options adéquates peuvent détecter certaines incohérences mais quoi qu'il arrive ils ne sont pas là pour remplacer ton cerveau)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Il te faut revoir les notions de visibilité des variables. Une variable n située dans un bloc A ne sera pas la même chose qu'une variable n située dans un bloc B. De plus un tableau float x[n] en tant que paramètre (alors que n n'existe pas) je n'arrive même pas à comprendre comment ça compile et ce que le compilateur peut y comprendre (peut-être y voit-il un VLA?). Idem pour le #define NB_ELEM sans valeur (ceci dit essayer d'afficher ensuite NB_ELEM d'une quelconque façon entraine une erreur de compilation).
    [...]
    Dans le cas de void changer_fichier(int N2, float x1[NB_ELEM]) on obtient le prototype void changer_fichier(int N2, float x1[]) qui est tout à fait valide et équivalent à void changer_fichier(int N2, float *x1).

    Dans le cas void affichage(int n , float x[n]) c'est la notation VLA et non un VLA qui est utilisé. n est bien défini auparavant en tant qu'int, il n'y a donc pas de soucis. Cette utilisation de la notation VLA sera d'ailleurs recommandée dans la prochaine norme C23 afin d'améliorer entre autre la lisibilité.
    En l'état void affichage(int n , float x[n]) est strictement équivalent à void affichage(int n , float x[]).

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par WhiteCrow Voir le message
    En l'état void affichage(int n , float x[n]) est strictement équivalent à void affichage(int n , float x[]).
    Joli
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre régulier Avatar de gijy
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Points : 83
    Points
    83
    Par défaut
    avec float X1[n] et float x2[n] tu veux sans doute vouloir créer dynamiquement tes tableaux; or avec cette ecriture c'est à la compilation que la zone memoire est allouée. n n'etant connu lors de la compile.....
    Tu as donc toutes les chances d'avoir une taille de tableau farfelue et donc de taper dans une zone non allouée à ton prog d'où l'erreur de segmentation à l'execution.
    Pour gérer dynamiquement des tailles de tableaux en C tu doit passer par les fonctions malloc and co et de travailler avec des pointeurs.

    Pour le reste je suis d'accord avec les reponses NB_ELEM non definie, init du tableau dans la fonction d'affichage!!! etc...

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gijy Voir le message
    avec float X1[n] et float x2[n] tu veux sans doute vouloir créer dynamiquement tes tableaux; or avec cette ecriture c'est à la compilation que la zone memoire est allouée. n n'etant connu lors de la compile.....
    Ce n'est plus vrai depuis qu'existent les VLA (Variable Length Array). Avec ce nouvel outil, tu peux créer un tableau dynamique non connu au moment de la compilation
    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
     
    int main() {
    	// Saisie taille
    	int n;
    	fputc('?', stdout);
    	scanf("%d", &n);
    	printf("n=%d\n", n);
     
    	// VLA
    	int tab[n];
    	for (int i=0; i < n; i++) tab[i]=i*i;
    	for (int i=0; i < n; i++) printf("tab[%d]=%d\n", i, tab[i]);
    }

    Ceci dit personnellement je n'aime pas car si le tableau ne peut pas être alloué, tu n'as aucun moyen de le détecter avant remplissage (et là... ). Je préfère donc en rester au bon vieux malloc dans lequel tu peux tester NULL pour vérifier la réussite de l'allocation avant de continuer le travail.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Probleme mémoire: écriture gros fichier
    Par rnn430 dans le forum Débuter
    Réponses: 5
    Dernier message: 17/11/2009, 10h01
  2. Empêcher la lecture d'un fichier pendant son écriture
    Par FredericB dans le forum C++Builder
    Réponses: 1
    Dernier message: 25/07/2007, 18h30
  3. probleme d'ecriture dans un fichier texte
    Par azrael88370 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/01/2005, 17h33
  4. Probleme d'ecriture dans un fichier en mode Text
    Par bbozet dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/01/2004, 13h46
  5. Probleme sur le Fields des fichiers Xmlgram
    Par Sandrine75 dans le forum XMLRAD
    Réponses: 4
    Dernier message: 20/03/2003, 17h09

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