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 723
    Points
    5 723
    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é.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    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...

  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 : 50
    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.

  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 723
    Points
    5 723
    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...

  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 723
    Points
    5 723
    Par défaut
    Essaie d'allonger le temps de ton sleep, 3millisecondes et peut être trop court pour sync. Quelle taille fait le fichier ?

  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 : 50
    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).

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    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

  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 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    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 */
            }
        }
    }

  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 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    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

  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).

  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 723
    Points
    5 723
    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

  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 723
    Points
    5 723
    Par défaut
    Autant poser un verrou et basta, paf !

  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