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 :

passage de unix à windows pour une fonction


Sujet :

C

  1. #1
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut passage de unix à windows pour une fonction
    Bonjour à tous !
    J'ai un programme qui doit lire une table dans un fichier du type :
    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
    Amount of points :  102 
    Calibration data :  
    ------------------- 
    Digital Level Temperature
    DL °C
    584 -273
    588 20
    592 40
    599 60
    610 80
    627 100
    652 120
    685 140
    730 160
    789 180
    863 200
    954 220
    1064 240
    1196 260
    1350 280
    1528 300
    C'est un collègue qui faisait tourner ce programme sous unix.
    J'ai identifié le problème, et je subodore qu'il vient du code mis en rouge:

    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
    
    while ( (sscanf(&FileLUTStockMem[i], "%s\t%s", str1, str2) == 2) && ( i < TailleFichier-1 ) )
    {
    *pxLUT = atol (str1);
    *pyLUT = atol (str2);
     
    printf("\n");
    printf("%03i:%07i->%04i ", j, (int)*pxLUT, (int)*pyLUT);
    
    pxLUT++;
    pyLUT++;
    j++;
    // Recherche le retour chariot suivant.
    while (FileLUTStockMem[i++] != 0x0D && ( i < TailleFichier-1 ) );
    str1[0]='\0';
    str2[0]='\0';
    }
    
    En effet, au débogage, i passe de 450 à 1800. Résultat: seule ma première ligne est lue, le reste, c'est du n'importe quoi!

    Comment indiquer un retour de chariot ?

    Merci à vous !

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    '\r' a la place de 0x0D serait plus conforme mais ne changera vraissemblablement rien.

    J'ai l'impression que le fichier est ouvert en mode texte mais ne le devrait pas.

  3. #3
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Tout à fait, le fichier est ouvert en mode texte, car c'est un .txt .
    En fait, pour te donner plus de précisions, mon projet est entièrement C++. Seule cette partie de mon projet qui communique avec une base de donnée est en C, car fonctions "toute faite" déjà utilisé par des collègues sous unix!

    Merci de ton aide.

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    sous linux un retour chariot est uniquement composé d'un \r (0x0D) sous windows, il s'agit de deux caractères : \r\n (0x0D 0x0A)...

    il te faudra donc étendre un peu le test

  5. #5
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    J'ai donc changé mon code par celui-ci !

    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
    
    while ( (sscanf(&FileLUTStockMem[i], "%s\t%s", str1, str2) == 2) && ( i < TailleFichier-1 ) )
    {
    *pxLUT = atol (str1);
    *pyLUT = atol (str2);
    // Decommenter ces 2 lignes pour afficher le contenu des LUT brutes.
    
    /*if (j == 0) */
    printf("\n");
    printf("%03i:%07i->%04i ", j, (int)*pxLUT, (int)*pyLUT);
    
    pxLUT++;
    pyLUT++;
    j++;
    // Recherche le retour chariot suivant.
    while (FileLUTStockMem[i++] != '\r\n' && ( i < TailleFichier-1 ) );
    str1[0]='\0';
    str2[0]='\0';
    }
    
    Cependant, je n'ai maintenant plus qu'une seule itération
    i passe de 450 à 1993, qui est la taille du fichier ! ^^

    Tu as une idée Swoög?

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par poukill
    Tout à fait, le fichier est ouvert en mode texte, car c'est un .txt .
    Et? Si sous Unix on s'attend a avoir un 0x0D dans un fichier, ce n'est pas un fichier texte mais un fichier binaire.

    Sous Unix, la representation d'une fin de ligne, c'est 0x0A (le caractere LF).
    Sous Windows, c'est la paire de caracteres 0x0D 0x0A (CR, LF).

    En mode texte sous windows, cette paire est transformee simplement en un '\n'.

  7. #7
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    D'accord, j'avais pas tout pigé.
    Le fichier est ouvert en mode binaire via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    
    descFichierLUT = open (FileNm, O_RDONLY);
    
    Et effectivement, un \n fonctionne parfaitement, je récupère bien tout mon fichier...

    Merci Jean-Marc!

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

Discussions similaires

  1. passage de parametre pour une fonction de validation
    Par kaygee dans le forum ASP.NET
    Réponses: 5
    Dernier message: 08/10/2009, 11h25
  2. passage des paramètres pour une fonction
    Par monalise dans le forum NetBeans
    Réponses: 4
    Dernier message: 20/08/2009, 09h36
  3. Réponses: 4
    Dernier message: 07/01/2009, 23h46
  4. paramètres pour une fonction
    Par bul dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 28/05/2005, 07h49
  5. passage de tableau 2D a une fonction
    Par watashinoitadakimasu dans le forum C
    Réponses: 2
    Dernier message: 11/09/2003, 02h33

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