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 :

ifstream lecture de fichier disparu


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 52
    Points : 53
    Points
    53
    Par défaut ifstream lecture de fichier disparu
    Hello

    Quelqu'un peux t'il m'expliquer comment cela se fait:
    Je suis sur linux et j'ai un programme qui lis un fichier à l'aide d'un ifstream.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ifstream input("fichier.txt");
    string ligne;
    while (1)
    {
      while(getline(input, ligne))
      {
        cout << "Ligne lue [" << ligne << "]." << endl;
        sleep(3);
        input.sync();
      }
    }
    Je ralentis la lecture avec le sleep pour avoir le temp de faire un RM de fichier.txt alors qu'il reste encore des lignes à lire.
    Et bin ce prog continue à lire ces lignes (pourtant je synchronise à chaque coup).
    Comment y fait? le sync() ne remais pas à jour le buffer?
    Comment puis-je détecter la disparition du fichier? (parce que c'est surtout ca qui m'interesse)

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Mauvais forum ici c'est C.

    Sinon getline ne génére pas une exception ou ne renvoi pas de code erreur ?

    Pour sync il faut lire la documentation c'est normalement expliqué.
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Normalement, un fichier ouvert en lecture est verrouillé automatiquement pour ne pas être modifié ni supprimé.

    Sous un système unixoïde, je suppose que le fichier est immédiatement retiré du répertoire, mais qu'il ne disparait vraiment qu'après la fermeture de tous les descripteurs pointant dessus...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 52
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par hegros Voir le message
    Sinon getline ne génére pas une exception ou ne renvoi pas de code erreur ?
    Et non il continue comme si de rien n'était

    Citation Envoyé par hegros Voir le message
    Pour sync il faut lire la documentation c'est normalement expliqué.
    Trop facile.
    Le man est léger et semble allez dans mon sens: "Synchronize input buffer with source of characters" [synchronise le buffer d'entrée avec la source de charactères]
    Pourtant cela ne marche pas

    Citation Envoyé par Médinoc Voir le message
    Normalement, un fichier ouvert en lecture est verrouillé automatiquement pour ne pas être modifié ni supprimé.
    Sous windows oui mais pas sous linux

    Citation Envoyé par Médinoc Voir le message
    Sous un système unixoïde, je suppose que le fichier est immédiatement retiré du répertoire, mais qu'il ne disparait vraiment qu'après la fermeture de tous les descripteurs pointant dessus...
    Possible ou alors c'est le cache de lecture du disque dur qui conserve la mémoire du fichier. Quoi qu'il en soit c'est concervé

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Si tu veux juste tester si ton fichier existe, je te conseillerai d'utiliser les fonctions spécifiques à ton OS qui indiquent si un fichier existe.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Si tu veux juste tester si ton fichier existe, je te conseillerai d'utiliser les fonctions spécifiques à ton OS qui indiquent si un fichier existe.
    Oui mais dans ce cas tu fais comment, tu testes son existence à chaque tour de boucle ?

    Citation Envoyé par Mizar75
    Trop facile.
    Si la doc n'en dit pas plus...
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Essaie d'allonger le temps de ton sleep, 3millisecondes et peut être trop court pour sync. Quelle taille fait le fichier ?
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par hegros Voir le message
    Oui mais dans ce cas tu fais comment, tu testes son existence à chaque tour de boucle ?
    Soit ça, soit tu utilises des fonctions de l'OS qui te notifient lors d'une modification d'un répertoire (je ne sais pas s'il en existe sous Linux).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 624
    Points : 30 667
    Points
    30 667
    Par défaut
    Salut,

    Ceci dit, le fait de vouloir supprimer un fichier dont tu sais qu'il est ouvert en input ne te paraît-il pas légèrement... suicidaire
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 52
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    Ceci dit, le fait de vouloir supprimer un fichier dont tu sais qu'il est ouvert en input ne te paraît-il pas légèrement... suicidaire
    Pas seulement légérement ...... malheureusement je ne maitrise pas mes spec:

    Un application ecrit, dans un fichier, des infos que je dois lire. Sur action de l'utilisateur (ou crash et redémarrage de l'appli) le fichier est detruit et re-créé (même nom mais pas même inode). A moi de detecter cette disparition pour le ré-ouvrir.

    Je suis d'accord c'est NUL, pas performant, et tout et tout ... mais c'est mes spec.

    Citation Envoyé par hegros Voir le message
    Essaie d'allonger le temps de ton sleep, 3millisecondes et peut être trop court pour sync. Quelle taille fait le fichier ?
    C'est 3 sec
    La taille est qq kilo au début pour flirter avec les Mo au bout de qq heures de fonctionnement.

    Citation Envoyé par JolyLoic Voir le message
    Si tu veux juste tester si ton fichier existe, je te conseillerai d'utiliser les fonctions spécifiques à ton OS qui indiquent si un fichier existe.
    Nope ce qui m'interesse vraiment c'est le contenu.

  11. #11
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 624
    Points : 30 667
    Points
    30 667
    Par défaut
    Citation Envoyé par Mizar75 Voir le message
    Pas seulement légérement ...... malheureusement je ne maitrise pas mes spec:

    Un application ecrit, dans un fichier, des infos que je dois lire. Sur action de l'utilisateur (ou crash et redémarrage de l'appli) le fichier est detruit et re-créé (même nom mais pas même inode). A moi de detecter cette disparition pour le ré-ouvrir.

    Je suis d'accord c'est NUL, pas performant, et tout et tout ... mais c'est mes spec.
    Heu, tu parle bien d'une application tierce à ce que tu est occupé à mettre en oeuvre (parce que, sinon, je ne vois pas l'intérêt: la fonction est quittée au moment où l'application crashe )

    Si oui, je verrais bien un truc du genre de
    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
     void lafonction(const std::string& filename)
    {
        //only application's death finishs this loop
        while(1) 
        {
            try
            {
                 /* opens file or re-open it after crash */
                 std::ifstream input(filename.c_str());
                 std::string line;
                 while(getline(input, line))
                 {
                      cout << "Ligne lue [" << ligne << "]." << endl;
                      /* hoping sync works */
                      input.sync();
                 }
            }
            catch(std::exception &e)
            {
                std::cout<<"some reading problem occures... exception catched :"
                     <<e.what()<<endl
                     <<"external application seems to have crashed... "
                     <<"waiting some time to allow app to restart"<<std::endl;
                /* waiting for some times, to be sure that file exists again */
                sleep(5); /*be carefull: sleep time changes between win and lin */
            }
        }
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  12. #12
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 52
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Heu, tu parle bien d'une application tierce à ce que tu est occupé à mettre en oeuvre (parce que, sinon, je ne vois pas l'intérêt: la fonction est quittée au moment où l'application crashe )
    Oui

    Citation Envoyé par koala01 Voir le message
    Si oui, je verrais bien un truc du genre de
    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
     void lafonction(const std::string& filename)
    {
        //only application's death finishs this loop
        while(1) 
        {
     
            try
            {
                 /* opens file or re-open it after crash */
                 std::ifstream input(filename.c_str());
                 std::string line
                 while(getline(input, line)
                 {
                      cout << "Ligne lue [" << ligne << "]." << endl;
                      /* hoping sync works */
                      input.sync();
                 }
            }
            catch(std::exception &e)
            {
                std::cout<<"some reading problem occures... exception catched :"
                     <<e.what()<<endl
                     <<"external application seems to have crashed... "
                     <<"waiting some time to allow app to restart"<<std::endl;
                /* waiting for some times, to be sure that file exists again */
                sleep(5) /*be carefull: sleep time changes between win and lin */
            }
        }
    }
    Ca à l'air bien. Je vais tenter.

    Merci

  13. #13
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 624
    Points : 30 667
    Points
    30 667
    Par défaut
    Autant préciser que ce code est donné "en vrac", sans même la moindre tentative de compilation...

    La logique me semble être bonne, mais je ne jurerais pas qu'il n'y a pas d'erreur de syntaxe, ni que le codage fasse réellement ce que j'avais en tête

    Un simple exemple: la relecture m'a fait "tomber" sur un ; manquant apres le sleep dans le catch
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  14. #14
    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
    La supposition de Médinoc est correcte: l'effacement ne fait qu'enlever la reference a un fichier dans le repertoire. Le fichier n'est reellement detruit que quand il n'existe plus aucunes references (entrees dans les repertoires -- avec les liens hard, on peut en avoir plusieurs pour le meme fichier -- et ouvertures). Une technique habituelle sous Unix pour les fichiers temporaires est de les ouvrir puis de les effacer. Ils continuent a exister jusqu'a ce qu'on les ferme.

    Donc le seul moyen de savoir que le fichier a changer, est de noter son inode au depart (et son device tant qu'a faire pour eviter les petits jeux avec les liens symboliques) et de verifier periodiquement (a chaque lecture, toutes les n lectures...) que c'est bien toujours le meme fichier (meme device, meme inode). Et encore, j'ai un doute que ca marche avec les systemes de fichiers distribues (genre NFS).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  15. #15
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Une autre solution serait aussi de poser un verrou exclusif sur le fichier. Ainsi la tentative d'effacement sera rejeté par le système, si ca rentre dans tes specs biensûr
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  16. #16
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 52
    Points : 53
    Points
    53
    Par défaut
    Je vais m'ammuser.
    Merci à tous pour vos réponses.

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Une methode sale: Tu peux essayer d'ouvrir le fichier sur un autre ifstream et verifier la reussite de cette operation.

    J'ai honte, c'est vraiment moche mais ca marche.

  18. #18
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Autant poser un verrou et basta, paf !
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  19. #19
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 52
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par pyrho Voir le message
    Une methode sale: Tu peux essayer d'ouvrir le fichier sur un autre ifstream et verifier la reussite de cette operation.

    J'ai honte, c'est vraiment moche mais ca marche.
    c'est une bidouille mais elle marche dans y'a pas de honte a avoir.

  20. #20
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 52
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par hegros Voir le message
    Autant poser un verrou et basta, paf !
    Malheureusement ceci empechera l'autre application d'alimenter le fichier en données.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 10
    Dernier message: 14/01/2013, 14h19
  2. ifstream lecture dans un fichier
    Par redkan dans le forum C++
    Réponses: 6
    Dernier message: 05/10/2007, 00h55
  3. Probleme lecture de fichier / ifstream
    Par Valkirion dans le forum SL & STL
    Réponses: 2
    Dernier message: 16/05/2007, 22h19
  4. Ifstream > Lecture d'un fichier > Format
    Par Zenol dans le forum SL & STL
    Réponses: 15
    Dernier message: 19/12/2005, 11h04
  5. Réponses: 4
    Dernier message: 04/11/2005, 09h04

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