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 :

Du matlab au C


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 33
    Par défaut Du matlab au C
    J'ai calculé une matrice sur Matlab, et je souhaite lire les valeurs de celle ci dans un programme C. J ai écris ce programme :

    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
    int main(int argc, char *argv[])
    {
      double t;
      char c;
      int i=0;
      FILE *fp;
      fp=fopen("filtre.dat","r+");
      if (fp == NULL)
    	{
    		printf("Erreur fichier\n");
    	}
      else
    	{
    	  while((c=fgetc(fp)) != EOF)
    		{
    			fseek(fp,8,SEEK_SET+(8*i));
    			fscanf(fp,"%lf",&t);
    			if(t!=0.0)  printf("%d:\t%lf\n",i,t);
    			i++;
    		}
     
    	  if(feof(fp))
    	  {
    		printf("fin de fichier\n");
    	  }
    	  else if(ferror(fp))
    	  {
    		printf("erreur de lecture\n");
    	  }
     
    	}
      fclose(fp);
      system("PAUSE");
      return 0;
    }
    Le programme marche, sauf que j'arrive pas d'une part à lire toutes les valeurs, et j atteind pas la fin du fichier (c un fichier de 130 Ko)
    Est ce que quelqu'un peut m'aider.
    Merci d'avance

  2. #2
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    Lis tu un fichier binaire si oui le caractère ÿ met fin à la lecture ÿ = 255 en ascii

    est le bienvenue

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 33
    Par défaut
    merci de ta réponse gnto,
    le fichier que je lis a été crée à partir de matlab avec la commande "save". Quand je l'ouvre avec matlab, il me lis bien une matrice. sauf que mon prog C n'arrive pas à lire les bonnes valeurs de la matrice puisque normalement c'est que des réel alors que le prog me lis des entiers (ou plutot m'affiche des entiers), ceci mis à part le fait que je n'atteind toujours pas la fin du fichier même en lisant en binaire, puisque il ne m affiche pas "fin de fichier".
    Voila, est ce que vous pensez que le probleme viens de matlab et du format auquel il enregistre le fichier, ou du programme C?

  4. #4
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    J'ai pas bien compris, ton fichier est du texte ou du binaire ?

    Si c'est du texte, tu pourrai donner sur ce forum un petit bout du fichier pour voir si tu fais correctement ta lecture, ça ferai peut être avancer un peu les choses


    Ton programme plante ? ou alors il t'affiche le message "erreur de lecture" ?

  5. #5
    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 kreitech
    le fichier que je lis a été crée à partir de matlab avec la commande "save".
    Comment le fichier est-il spécifié ? SI c'est un format interne propriétaire, ça risque d'être compliqué à récupérer...

    Essaye de voir si au lieu de 'save', tu ne peux plutôt faire 'export' vers un format simple (CSV etc.) ?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Par défaut
    Il me semble qu'il est possible de faire du C sous matlab.

  7. #7
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 33
    Par défaut
    Tu avais raison Emmanuel, en effet la commande save sous matlab permet juste d'enregistrer une variable .mat mais pas un fichier binaire.
    J ai utilisé alors la fonction fwrite pour générer un fichier binaire (.bin) pour pouvoir lire toutes les valeurs de mon fichier.
    code matlab:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    load filtre.mat filtre
    [x, y]=size(filtre);
    fid=fopen('filtre.bin','w');
    fwrite(fid,double(filtre),'double');
    fclose(fid);
    Cependant il me reste un problème de format, en effet tous les coef de ma matrice sont des réels <1, or ma variable t me rend des entiers, et pourtant je lie avec un %lf !!!
    j explique par un exemple:
    le fichier filtre.bin contient la matrice:
    filtre =

    0.1000 0.2000 0.3000
    0.4000 0.0010 0.3000
    0 0.1500 0.1200

    mon programme C:
    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
    fp=fopen("filtre.bin","rb");
      if (fp == NULL)
    	{
    		printf("Erreur fichier\n");
    	}
      else
    	{
    	  while((c=fgetc(fp)) != EOF)
    		{
    			//fseek(fp,8,SEEK_SET+(8*i));
    			fscanf(fp,"%lf",&t);
    			if(t!=0.0)  printf("%d:\t%lf\n",i,t);
    			i++;
    		}
     
    	  if(feof(fp))
    	  {
    		printf("fin de fichier\n");
    	  }
    	  else if(ferror(fp))
    	  {
    		printf("erreur de lecture\n");
    	  }
     
    	}
      fclose(fp);
    me donne les valeurs suivantes:
    0: -92559631349317831000000000000000000000000000000000000000000000.000000
    1: -92559631349317831000000000000000000000000000000000000000000000.000000
    2: -92559631349317831000000000000000000000000000000000000000000000.000000
    3: -92559631349317831000000000000000000000000000000000000000000000.000000
    4: -92559631349317831000000000000000000000000000000000000000000000.000000
    5: -92559631349317831000000000000000000000000000000000000000000000.000000
    6: -92559631349317831000000000000000000000000000000000000000000000.000000
    7: -92559631349317831000000000000000000000000000000000000000000000.000000
    8: -92559631349317831000000000000000000000000000000000000000000000.000000
    9: -92559631349317831000000000000000000000000000000000000000000000.000000
    10: -92559631349317831000000000000000000000000000000000000000000000.000000
    11: -92559631349317831000000000000000000000000000000000000000000000.000000
    12: -92559631349317831000000000000000000000000000000000000000000000.000000
    13: -92559631349317831000000000000000000000000000000000000000000000.000000
    14: -92559631349317831000000000000000000000000000000000000000000000.000000
    15: -92559631349317831000000000000000000000000000000000000000000000.000000
    16: -92559631349317831000000000000000000000000000000000000000000000.000000
    17: -92559631349317831000000000000000000000000000000000000000000000.000000
    18: -92559631349317831000000000000000000000000000000000000000000000.000000
    19: -92559631349317831000000000000000000000000000000000000000000000.000000
    20: -92559631349317831000000000000000000000000000000000000000000000.000000
    21: -92559631349317831000000000000000000000000000000000000000000000.000000
    22: -92559631349317831000000000000000000000000000000000000000000000.000000
    23: -92559631349317831000000000000000000000000000000000000000000000.000000
    24: -92559631349317831000000000000000000000000000000000000000000000.000000
    25: -92559631349317831000000000000000000000000000000000000000000000.000000
    26: -92559631349317831000000000000000000000000000000000000000000000.000000
    27: -92559631349317831000000000000000000000000000000000000000000000.000000
    28: -92559631349317831000000000000000000000000000000000000000000000.000000
    29: -92559631349317831000000000000000000000000000000000000000000000.000000
    30: -92559631349317831000000000000000000000000000000000000000000000.000000
    31: -92559631349317831000000000000000000000000000000000000000000000.000000
    32: -92559631349317831000000000000000000000000000000000000000000000.000000
    33: -92559631349317831000000000000000000000000000000000000000000000.000000
    34: -92559631349317831000000000000000000000000000000000000000000000.000000
    35: -92559631349317831000000000000000000000000000000000000000000000.000000
    36: -92559631349317831000000000000000000000000000000000000000000000.000000
    37: -92559631349317831000000000000000000000000000000000000000000000.000000
    38: -92559631349317831000000000000000000000000000000000000000000000.000000
    39: 333333.000000
    40: 333333.000000
    41: 333333.000000
    42: 333333.000000
    43: 333333.000000
    44: 333333.000000
    45: 333333.000000
    46: 333333.000000
    47: 333333.000000
    48: 333333.000000
    49: 333333.000000
    50: 333333.000000
    51: 333333.000000
    52: 333333.000000
    53: 333333.000000
    fin de fichier
    Appuyez sur une touche pour continuer...


    ces valeurs sont complètement abérantes.
    Est ce que vous pouvez m aidez ?

  8. #8
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par gnto
    Lis tu un fichier binaire si oui le caractère ÿ met fin à la lecture ÿ = 255 en ascii
    Ptit détail, l'ascii va de 0 à 127
    C'est en iso-8859-1/15 (latin1/latin9) ou encore en "windows-1252" (pareil que latin9 mais avec les caracteres de controle en plus) que ce caractere vaut 255

  9. #9
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    Citation Envoyé par Gruik
    Ptit détail, l'ascii va de 0 à 127
    C'est en iso-8859-1/15 (latin1/latin9) ou encore en "windows-1252" (pareil que latin9 mais avec les caracteres de controle en plus) que ce caractere vaut 255
    Merci, décidément today is not my day, Ce caractère est mal quand même .

  10. #10
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 33
    Par défaut
    je vous avoue que ce que vous dites ne m aide pas!! je fait bien la lecture en mode "rb", et pourtant ya tjrs un pb !!

  11. #11
    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 kreitech
    le fichier filtre.bin contient la matrice:
    filtre =

    0.1000 0.2000 0.3000
    0.4000 0.0010 0.3000
    0 0.1500 0.1200

    mon programme C:
    En fait, le ficher est au format texte...
    Essaye ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
       fp=fopen ("filtre.bin", "r");
    ...
             double t;
    	  while (fscanf(fp,"%lf",&t) == 1)
              {
                 if (t != 0.0)  
                    printf ("%d:\t%lf\n", i, t);
                 i++;
              }
    ...

  12. #12
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 33
    Par défaut
    ta solution donne ce resultat:
    0: 333333.000000
    1: 333333.000000
    2: 333333.000000
    fin de fichier
    Appuyez sur une touche pour continuer...


    donc c pareil !!
    cependant, si tu connais un peu matlab, j ai pu vérifier que le fichier contient exactement les bonnes valeur grace a ce petit programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    fid=fopen('filtre.bin','r');
     
      Y=fread(fid,[3,3],'double');
      Y;
     
    fclose(fid);
    et j ai Y =

    0.1000 0.2000 0.3000
    0.4000 0.0010 0.3000
    0 0.1500 0.1200

    sachant que la fonction fread de matlab lit en binaire le fichier au format qu on lui précise en argument, en l'occurence ici c double.
    Je ne comprend encore pas pourkoi pour le meme fichier, le prog C ne lit pas les bonnes valeurs !!

  13. #13
    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 kreitech
    ta solution donne ce resultat:
    0: 333333.000000
    1: 333333.000000
    2: 333333.000000
    fin de fichier
    Appuyez sur une touche pour continuer...


    donc c pareil !!
    cependant, si tu connais un peu matlab, j ai pu vérifier que le fichier contient <...>
    Je ne connais pas du tout Matlab. Mais essaye de sauvegarder au format texte, parce qu'en binaire, c'est pas portable. En texte, on peut le relire facilement...

  14. #14
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 33
    Par défaut
    Tu as raison Emmanuel, j ai tout refais avec des fichiers .txt, et l'essaie a été concluant.
    Merci de votre aide

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

Discussions similaires

  1. [LabView-MATLAB] Conversion de fichier binaire
    Par flzox dans le forum LabVIEW
    Réponses: 3
    Dernier message: 20/01/2007, 18h42
  2. [visual C++/Matlab] communication entre les deux
    Par Bilouzzz dans le forum MFC
    Réponses: 2
    Dernier message: 15/10/2005, 05h05
  3. Réponses: 2
    Dernier message: 02/09/2005, 15h23
  4. Clone Matlab
    Par devmat dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 30/04/2005, 16h44
  5. OpenGl - Matlab
    Par ManuG dans le forum OpenGL
    Réponses: 2
    Dernier message: 19/01/2005, 15h04

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