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 :

Petit problème de fseek()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Par défaut Petit problème de fseek()
    Bonjour,

    Voici mon problème :
    Je cherche à copier des lignes d'un fichier .csv suivant la valeur du deuxième argument de la ligne.
    J'ai donc eu la démarche suivante :
    1°) Sauvegarder l'offset du début de la ligne
    2°) fgets sur la ligne
    3°) Analyse du deuxième argument
    4°) Si le deuxième argument est > 100, copier la ligne (par retour au début de ligne et fgets de nouveau

    Voici donc mon code :
    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
     
    while (fgets(line, sizeof(line), fp)) {
    	offset = fseek(fp,0L,SEEK_CUR);
    	p = strchr(line, ',');
    	*p='\0';
    	p0=p+1;
    	p = strchr(p0, '\n');
    	sscanf(p0,"%f",&j);
    	if (j >= 100) {
    		fseek(fp,offset,SEEK_SET);
    		fgets(line, sizeof(line), fp);
    		fputs(line,fptemp);
    		++nb_ligne_exploitable;
    	}
    	printf("%d\n", offset);
    }
    Et là, c'est le drame : il n'avance jamais et reste sur la première ligne !!!

    Merci d'avance pour vos réponses

  2. #2
    Membre émérite
    Avatar de Freed0
    Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    635
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 635
    Par défaut
    Salut,

    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
     
    FILE *fp = fopen(...);
    FILE *fptemp = ???
    char line[1024];
    long offset = 0;
    char *p = NULL;
    char *p0 = NULL;
    float j = 0.0;
    int nb_ligne_exploitable = 0;
     
    while(fgets(line, sizeof(line), fp) != NULL)
    {
        /* Tu ferais pas mieux d'utiliser ftell ?
        offset = fseek(fp,0L,SEEK_CUR); */
        offset = ftell(fp);
     
        p = strchr(line, ',');
        if(p != NULL)
            *p = 0;
     
        p0 = p + 1;
        /* A quoi te sert cette ligne ? p n'est même plus exploité par la suite... */
        p = strchr(p0, '\n');
        sscanf(p0, "%f", &j);
     
        if(j >= 100)
        {
            fseek(fp, offset, SEEK_SET);
    	fgets(line, sizeof(line), fp);
    	fputs(line, fptemp);
    	++nb_ligne_exploitable;
        }
     
        printf("%d\n", offset);
    }
    A mon avis, l'erreur doit venir de la 'saisie' du double... D'ailleurs, pourquoi utilises-tu un double ?
    Pour bien faire, tu devrais mettre des printf à quelques endroits clés de ton code pour vérifier tes valeurs et t'assurer que tu passes dans le if

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    ben c'est normal avec ton fseek tu reviens toujours à la première ligne... 0L te ramènes toujours au début du fichier.

    Pourquoi faire compliqué quand on peut faire simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     float nombre ;
     
    while (fgets(line, sizeof(line), fp)) {
    	p = strchr(line, ',' );
            if ( p == NULL )
              continue ;
    	sscanf((p+1),"%f",&nombre);
    	if (nombre >= 100.0) {
    		fputs(line,fptemp);
    		++nb_ligne_exploitable;
    	}
    }
    Si nombre est un flottant. Si c'est un entier, alors mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf ((p+1), "%d",&nombre)

Discussions similaires

  1. utiliser fseek dans un petit problème
    Par fred_sell dans le forum Débuter
    Réponses: 18
    Dernier message: 29/01/2010, 13h30
  2. Petit problème de décimales !
    Par ridan dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/09/2004, 21h24
  3. Réponses: 17
    Dernier message: 13/07/2004, 20h37
  4. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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