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 :

Exercice : inverser les lignes d'un fichier .txt


Sujet :

C

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Exercice : inverser les lignes d'un fichier .txt
    Bonjour,

    Je m appelle Julie, je suis étudiante a Lille et on me demande de faire un programme en C qui inverse les lignes d'un fichier texte.
    Avec, un fichier d'entree d'un nombre de ligne quelconque et un fichier de sortie pour le ranger, comme arguments.
    Pour le fichier d'entree le nombre est limité a 50 caracteres par lignes.

    Je dois faire ca pour lundi matin.

    je vous demande de l aide !!!

    MERCI MERCI !!

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    utilise simplement la fonction fseek.

    Tu ouvre ton premier fichier et tu va à la fin.
    Grâce à fseek, tu le lis à l'envers jusqu'à rencontrer un '\n'
    Tu enregistre la position avec ftell
    De la avec un fgets tu lis la ligne et tu l'écris dans ton deuxième fichier
    Tu reviens à la position enregistrée avec fseek et tu recommence tant que tu n'as pas tout lu le fichier.

  3. #3
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Sinon tu peux toujours stocker ton fichier dans un tableau de char à deux dimensions. TU l'alloues dynamiquement avec le nombre de ligne indiqué en argument. Tu lis chaque ligne avec un fgets(s[i], 50, f_in) et ensuite tu reviens en arrière à partir de ton indice de première dimension en écrivant la chaîne courante dans le fichier de sortie.

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Heu en fait je ne sais pas du tout coder...
    et je n'ai pas le droit a la fonction fseek !
    la reponse de kirilenko me parait plus approprié a ce que j'attend !

    si il y en a un qui peux me fournir le code...

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    .... on est pas là pour faire ton exercice à ta place.

    Sinon, tu peux aussi faire une fonction récursive :


    void ta_fonction(FILE , FILE)
    {
    //lecture d'une ligne avec fgets
    //Si fichier non null, appel de ta_fonction(FILE, FILE);
    //Ecriture de ta ligne lu dans le fichier2
    }

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 172
    Points : 191
    Points
    191
    Par défaut
    Bonjour,

    bon pour ne pas m'attirer les foudre de Neckara, je te fournirai un pseudo-code.

    A noter que, sans vouloir te vexer Kirilenko, je te conseillerai plus un algo du style de celui de Neckara (bien que je pense qu'un algo récursif n'est pas le top niveau perf à cause des appels de fonction!) parce que celui de Kirilenko demande au moins la taille de ton fichier en mémoire (pas super en cas de gros fichiers).

    Voici un algo assez rapide et qui ne demande pas beaucoup de ressources :
    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
    buf = char[50]
    compteur = 0
    src <- Ouverture du fichier_source
    dest <- Ouverture du fichier destination
    positionnement à la fin de src
     
    Tant que tu n''es pas au début du fichier.
        Tant que charactere_lu <> '\n'
              char[compteur] = charactere_lu
              compteur++
     
         for buf[compteur] jusqu''à buf[0]
              ecriture de buf[compteur] dans dest
              compteur--
     
         ecriture du charactere '\n' dans dest
         compteur=0
    Voilà, à noter que j'ai jamais vu le pseudo-code donc ma syntaxe est loin d'être super mais j'espère que c'est assez clair et merci de me corriger si il y'a des erreurs ou des oublis dans l'algo.

    EDIT : D'ailleurs j'ai corrigé, c'est pas tant que tu n'es pas à la fin mais au début du fichier!

    Je te laisse gérer pour savoir si tu es au début du fichier ou non (un indice : fseek et un compteur de la taille du fichier!)

    Cordialement

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Citation Envoyé par baccali Voir le message
    Bonjour,

    bon pour ne pas m'attirer les foudre de Neckara, je te fournirai un pseudo-code.
    Si je refuse de fournir le code tout près, c'est que like i love c est une étudiante et on lui demande de faire un code.

    C'est donc un exercice qui intervient dans le cadre de sa formation.
    Si on le fait directement pour elle, l'exercice perd son utilité et ne servirais à rien.

    De plus, le but d'un forum est d'aider, or, en proposant directement la solution, on ne l'aide pas : le but n'est pas de réussir l'exercice, mais d'apprendre et de mettre en pratique ce que l'on a appris.

    Sans compter les règles : http://club.developpez.com/regles/#L4.13

    Donc ne lui fournissez pas la solution complète, ne lui donnez que des pistes, non pas pour ne pas me mettre en colère, mais pour elle.

  8. #8
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 172
    Points : 191
    Points
    191
    Par défaut
    Oui je sais bien et tu à raison de le spécifier t'inquiètes pas! C'était ironique.

  9. #9
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Je te laisse gérer pour savoir si tu es au début du fichier ou non (un indice : fseek et un compteur de la taille du fichier!)
    et je n'ai pas le droit a la fonction fseek !
    ?

    A noter que, sans vouloir te vexer Kirilenko, je te conseillerai plus un algo du style de celui de Neckara (bien que je pense qu'un algo récursif n'est pas le top niveau perf à cause des appels de fonction!) parce que celui de Kirilenko demande au moins la taille de ton fichier en mémoire (pas super en cas de gros fichiers).
    C'est sûr, c'est simplement une habitude que j'ai prise [charger le contenu d'un fichier en mémoire] afin d'éviter de parcourir le fichier plusieurs fois. Simplement, en effet ici ça n'a pas grande utilité.
    Et cela ne me vexe pas, bien au contraire.

  10. #10
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2009
    Messages : 172
    Points : 191
    Points
    191
    Par défaut
    En effet, j'avais pas vu qu'elle avait pas le droit à fseek

    Bon légère modif de l'algo (la syntaxe est aussi un peut plus conforme et je l'ai un peu simplifié!) :

    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
    buf = char[50]
    compteur = 0
    src <- Ouverture du fichier source
    dest <- Ouverture du fichier destination
    position <- taille src
    
    
    Tant que position <> 0
       
        Tant que ( buf[compteur] <- lecture du charactere a position ) <> '\n' 'ou position <> 0
              position--
              compteur++
    
         Tant que compteur <> 0
              ecriture de buf[compteur] dans dest
              compteur--
    EDIT : J'ai modifié l'algo (en gras souligné) pour vider le buffer lors de la dernière ligne de dest (première ligne de src) qui ne terminera pas par '\n'

    Cordialement

  11. #11
    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
    celui de Kirilenko demande au moins la taille de ton fichier en mémoire (pas super en cas de gros fichiers).
    On peut savoir comment faire sans mettre tout en mémoire si on n'a pas fseek.

    Allez, je suis doublement gentil, je donne une solution répondant à une généralisation du problème et je préviens que le style est volontairement tel qu'il ne faut pas le montrer à un professeur si on ne veut pas se retrouver poursuivi pour tentative d'assassinat.

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    void revert(char* beg, char* end)
    {
        while (beg < end) {
            char tmp = *--end;
            *end = *beg;
            *beg++ = tmp;
        }
    }
     
    int main(int argc, char** argv)
    {
     
        FILE *in = NULL, *out;
        size_t allocated = BUFSIZ, rd = 0, sz;
        char *buffer = malloc(allocated), *ptr1, *ptr2;
        int status = EXIT_FAILURE;
     
        if (buffer == NULL)
            goto bye;
        if (!(argc == 3 && (in = fopen(argv[1], "r")) && (out = fopen(argv[2], "w"))))
            if (in) goto closein; else goto bye;
        while ( (sz = fread(buffer+rd, 1, allocated-rd, in)) != 0) {
            rd += sz;
            if (rd == allocated) {
                char* newbuf = realloc(buffer, allocated+allocated/2);
                if (newbuf == NULL) {
                    rd -= allocated/2;
                    memmove(buffer, buffer+allocated/2, rd);
                } else {
                    allocated += allocated/2;
                    buffer = newbuf;
                }
            }
        }
        ptr1 = buffer;
        revert(ptr1, buffer+rd);
        while ( (ptr2 = memchr(ptr1, '\n', buffer + rd - ptr1)) != NULL) {
            revert(ptr1, ptr2);
            ptr1 = ptr2+1;
        }
        revert(ptr1, buffer+rd);
        if (fwrite(buffer, 1, rd, out) == rd)
            status = EXIT_SUCCESS;
     closeout:
        fclose(out);
     closein:
        fclose(in);
        free(buffer);
     bye:
        return status;
    }

  12. #12
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Whouawou ! J ai tout compris !!!

    Haaa vous etes top !!

    Un grand merci a vous tous !!!

  13. #13
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Faut que je note tout cela pour le ressortir à ma prof d'algo

    Dans un sens savoir relire un code d'une autre personne est une chose à savoir faire, mais je doute que like i love c soit assez expérimentée pour réécrire ton code.

    Je suis en IUT informatique (1er année) et je n'ai par exemple pas encore vu les :
    - goto
    - ++i
    - size_t
    - if(! ....)

    Donc normalement je ne devrais pas savoir ce que c'est donc en ce qui la concerne, j'ai peur qu'elle n'ai pas les cours pour comprendre correctement ton code.
    EDIT : j'ai rien dit^^

    Mais au moins elle a un exemple qui lui donne les fonctions à utiliser.

  14. #14
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    ++i incremente
    if condition
    ! negation exemple != n est pas egale c est du booleen !!
    ...

  15. #15
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Pardonne moi de d'avoir un peu sous-estimé tes connaissances en C^^

    N'oublie pas de mettre le sujet en 'résolu'

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

Discussions similaires

  1. Lire les lignes d'un fichier .txt en HTML
    Par Moustiik78 dans le forum Langage
    Réponses: 10
    Dernier message: 15/03/2014, 02h16
  2. Compter les lignes d'un fichier TXT
    Par Slyer4ever dans le forum C
    Réponses: 8
    Dernier message: 02/10/2013, 10h03
  3. Inverser les lignes d'un fichier csv
    Par azahiri dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 19/10/2012, 17h07
  4. Java - inverser les lignes d'un fichier volumineux
    Par Redouane81 dans le forum Général Java
    Réponses: 6
    Dernier message: 18/08/2011, 16h43
  5. Comparer les lignes d'un fichier txt
    Par Casimir* dans le forum VBScript
    Réponses: 3
    Dernier message: 28/08/2007, 15h12

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