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 :

Fichier de float vers matrice


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3
    Par défaut Fichier de float vers matrice
    Bonjour,

    Souhaitant récupérer des nombres d'un fichier Excel, je transforme d'abord les données dans un fichier texte, par exemple:

    0 1 2 3 4
    1 0 4,32 1 6
    2 1 0 2 5
    3 5 23546576 0 3
    4 2 3 4 0

    Mon but est de sauver ces nombres dans une matrice de type: data[1000][1000], avec par exemple data[1][2]=4,32

    Le problème est qu'avec fget je n'arrive pas à reconstituer les nombres (par exemple 4,32), à cause des espaces, différentes longueurs de nombres, virgules.

    Une fois le fichier ouvert avec fopen, quelle fonction dois-je utiliser svp?

    Deuxième question: est-ce possible de manipuler des matrices de float de 1000 sur 1000?

    Merci.
    Hervé

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Je pense que vous devriez essayer d'utiliser fscanf, et mettant un format du genre "%f".
    Il est possible que la FAQ présente sur ce site, vous apprenne à faire un bon code très sécurié .
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    J'attire ton attention sur le fait que la représentation texte des flottants est générée avec une virgule par excell, il faut donc avant de lancer une conversion chaine->flottant transformer ces virgules en points pour que ces chaines soient utilisables en C.

    Je crois que ce serait plus simple et plus efficace de travailler directement à partir du fichier excell (un csv?) que de t'imposer cette étape supplémentaire:
    je transforme d'abord les données dans un fichier texte
    Après tout, la seule différence est le séparateur que tu as transformé en espace.

    A+

    Pfeuh

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3
    Par défaut
    Bonjour,

    J'ai encore plus simplifié en m'inspirant de l'aide mais cela ne fonctionne toujours pas.

    Voici les données: le fichier "data6.txt" ne comprend que la valeur 9

    Le programme est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int
    main ()
    {
      int i[4];
      FILE *fichier = fopen ("data6.txt", "r");
      cout << fscanf(fichier,"%d",i[0]) << "\n";
      cout << i[0];      
      fclose (fichier);
      system("pause" );
      return 0;
    }
    Le résultat dans le terminal est:
    0
    2000660488Appuyez sur une touche pour continuer...
    Apparemment fscanf ne fonctionne pas dans ce contexte car il ne reconnait même pas la valeur 9.

    Hervé

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    Premièrement, la forum propose des fonctionnalités de tout dernier cri tel que les balises:
    [ c o d e ] et [ / c o d e ] (sans espaces) pour encadrer le code et le présenté d'une manière coloré et plutôt joli (cela dépendra des gouts)
    Les balises apparaitront automatiquement lors de l'addition d'un message si vous cliquez sur le bouton '#'
    Il existe aussi des balises [ q u o t e ] et [ / q u o t e ] pour tout les autres types de texte (bouton d'à coté).

    Maintenant, je serai assez content d'avoir le contenu du fichier de votre test entre des balises quote ... pour que je puisse être sur de ce que vous faites.

    EDIT:
    J'ai douté sur l'erreur, mais en faisant mon test j'ai trouvé :p. Votre compilateur l'indique même par le biais d'un warning. Vous devriez à l'avenir prendre ces messages au sérieux!
    Votre erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cout << fscanf(fichier,"%d",&i[0]) << "\n";
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Tu as des balises adaptées pour présenter ton code, utilise le.
    Tu fais un mix de C et de C++ dans ton code.
    Il faut envoyer un pointeur à la fonction fscanf sans quoi tu auras un comportement indéterminé.
    Tu dis vouloir récupérer des nombres à virgule, il faut donc que tu utilises un type adapté à ça (le double par ex.).
    Tu ne testes pas si ton fichier est bien ouvert.
    As-tu bien inclus les headers correspondants aux fonctions utilisées ?

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    Citation Envoyé par Pouet_forever Voir le message
    As-tu bien inclus les headers correspondants aux fonctions utilisées ?
    Oui car cela compile (vu qu'il a fait un test)

    Après je rajouterai aussi que, vous mélangez des fonctions C avec du C++ ... ce n'est pas une erreur en soit, mais cela n'est pas très sain non plus. Surtout lorsque le C++ apporte les mêmes fonctionnalités mais d'une manière avancées (voir la documentation de ifstream)

    EDIT: Ah bah euh oui cela a était dit
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3
    Par défaut
    J'ai recréé un fichier texte et ajouté le &; le programme récupère les informations.
    Voici le code avec les entêtes:

    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
     
    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
     
    int
    main ()
    {
     
      float i;
      float j;
     
      FILE *fichier = fopen ("nombre.txt", "r");
     
      if(fichier != NULL)
      {
                 fscanf(fichier,"%f %f", &i, &j);
                 printf("%f\n", j);                      // montre le deuxième nombre
      }    
      fclose (fichier);
     
      system("pause" );
      return 0;
     
    }
    Il me reste à chercher le moyen de sauvegarder dans une matrice.
    Dès que j'ai le code je l'ajouterai ici afin de résoudre la discussion.

Discussions similaires

  1. Lecture fichier csv vers matrice
    Par farimans dans le forum C++
    Réponses: 4
    Dernier message: 09/06/2014, 19h43
  2. Problème conversion float vers double
    Par jhenaff dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 27/01/2006, 10h39
  3. [Indy] Transfert de fichiers du serveur vers le client
    Par Nicodemus dans le forum Web & réseau
    Réponses: 4
    Dernier message: 28/10/2005, 17h00
  4. Conversion float vers int
    Par vargasvan dans le forum C
    Réponses: 2
    Dernier message: 05/10/2005, 17h29
  5. Réponses: 3
    Dernier message: 26/09/2005, 15h20

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