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 :

Déplacement dans un fichier, windows/linux


Sujet :

C

  1. #1
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut Déplacement dans un fichier, windows/linux
    bonjour, ma question concerne le code suivant :

    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
    /* si comm (##) => rien sinon => retour au début de la ligne */
    int verifierLigneCommentaire(FILE *fichier)
    {
    	char buffer[TAILLE_LIGNE_MAX]=" ";
     
    	fgets(buffer,sizeof(buffer),fichier);
    	buffer[strlen(buffer)-1]='\0';
     
    	if ( !( (strlen(buffer)>2 && buffer[0]==CAR_COMMENTAIRE && buffer[1]==CAR_COMMENTAIRE) || (!strlen(buffer)) ) )
    	{
    		fseek(fichier, -strlen(buffer)-1, SEEK_CUR);
    		return 0;
    	}
     
    	return 1;
    }
    Ce code marche très bien sous linux, sous windows pour qu'il marche je dois faire :

    fseek(fichier, -strlen(buffer)-2, SEEK_CUR);

    Pourquoi ?

  2. #2
    Membre éprouvé Avatar de yakamoneye
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 108
    Par défaut
    Bonsoir,
    tu utilises deux fonctions fseek() et strlen() c'est soit l'une soit l'autre.
    Essaie d'en isoler une par exemple strlen() en jouant sur sizeof(char)=1 et en programmant ta propre fonction strlen() pour deterniner la taille de ton buffer.

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Ce code marche très bien sous linux, sous windows pour qu'il marche je dois faire :

    fseek(fichier, -strlen(buffer)-2, SEEK_CUR);

    Pourquoi ?
    Parce que le codage de la fin de ligne dans le fichier sont différents : Dans un cas, il n'y en a qu'un caractère et dans l'autre deux.


    Il te faut utiliser ftell pour "repérer" la position du fichier sur laquelle tu veux revenir avec fseek.
    La norme le dit explicitement :
    7.19.9.2 The fseek function
    Synopsis
    1 #include <stdio.h>
    int fseek(FILE *stream, long int offset, int whence);
    Description
    ....
    4 For a text stream, either offset shall be zero, or offset shall be a value returned by an earlier successful call to the ftell function on a stream associated with the same file and whence shall be SEEK_SET.

  4. #4
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    oups, c'est vrai, j'avais oublié.

    merci.

  5. #5
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    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
    int verifierLigneCommentaire(FILE *fichier)
    {
    	char buffer[TAILLE_LIGNE_MAX]=" ";
    	long pos=ftell(fichier);
     
     
    	fgets(buffer,sizeof(buffer),fichier);
    	buffer[strlen(buffer)-1]='\0';
     
    	if ( !( (strlen(buffer)>2 && buffer[0]==CAR_COMMENTAIRE && buffer[1]==CAR_COMMENTAIRE) || (!strlen(buffer)) ) )
    	{
    		fseek(fichier, pos, SEEK_SET);
    		return 0;
    	}
     
    	return 1;
    }
    ne marche pas

  6. #6
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Salut,
    Citation Envoyé par Rniamo
    ne marche pas
    Peu-tu préciser ? Où veux-tu te positionné après l'appelle à fseek ?

  7. #7
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    si la ligne ne vérifie pas le test ( if (!()) ), je veux retourner au début de la ligne.

    edit : apperemment le problème venait d'ailleurs.

    merci à ceux qui ont répondus.

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par Rniamo Voir le message
    si la ligne ne vérifie pas le test ( if (!()) ), je veux retourner au début de la ligne.
    Pour l'instant, tu fais le contraire : si le test est vérifié tu retournes en début de ligne. (D'ailleurs, je trouve ce test bizarre).
    La fonction devrait également prendre en compte la fin du fichier et retourner cette information.

  9. #9
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    non, je fais ce que je veux.

    je prend la négation du test, donc c'est bon.

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par Rniamo Voir le message
    je prend la négation du test, donc c'est bon.
    Moi, j'appelle "le test" tout ce qu'il y a dans la condition du if

  11. #11
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    je me suis mal exprimé alors, désolé.

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

Discussions similaires

  1. droit d'execution dans un fichier.zip linux/windows
    Par steve0stine dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 21/05/2008, 21h26
  2. Réponses: 5
    Dernier message: 05/06/2007, 00h41
  3. Déplacement dans un fichier seekg tellg
    Par renlel dans le forum C++
    Réponses: 3
    Dernier message: 25/04/2007, 14h25
  4. déplacement dans un fichier.txt
    Par yohann007 dans le forum C
    Réponses: 11
    Dernier message: 21/03/2007, 11h06
  5. Réponses: 4
    Dernier message: 19/05/2006, 17h06

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