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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 ?

+ 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