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

MFC Discussion :

Utilisation CFile::Seek() et message d'erreur


Sujet :

MFC

  1. #1
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut Utilisation CFile::Seek() et message d'erreur
    Bonjour à tous,

    J'utilise un CFile pour lire un fichier texte depuis la fin. Le but est d'éviter de parcourir tout le fichier qui peut-être très grand (plusieurs méga...) pour gagner du temps.
    L'utilisation est un peu particulière car le fichier lu est continuellement écrit, mais de toutes façons je ne cherche pas à récupérer les lignes qui ont été écrites entre le moment où j'ai ouvert le fichier et celui où des lignes ont été rajoutées.
    Le problème est que j'ai le message d'erreur suivant qui apparaît : "Seek failed on an unnamed file".

    J'ai essayé mon code sur un fichier 'statique' et là, pas de problème.

    Est-ce que ma méthode est bonne ?

    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
     
    	CFile f;
    	CFileException e;
    	CString sLine = "";
    	int iLinesNumber = 0;
    	bool bError =false;
     
    	if(!f.Open(sLogFilePath,CFile::modeRead,&e))
    		return -1;
     
    	int iShiftFromEnd = -1;
    	char cCurrentChar = ' ';
    	CString sTemp;
    	CStringArray oFileNamesArray;
    	oFileNamesArray.RemoveAll();
     
    	while(iLinesNumber < m_MaxDefect && !bError)	//on lit chaque ligne du fichier en partant de la fin
    	{
    		f.Seek(iShiftFromEnd,CFile::end);
    		if(f.Read(&cCurrentChar,1) == 0)
    			bError = TRUE;
     
    		if(cCurrentChar == '\n')			//fin d'une ligne
    		{
    			if(sLine.Find("&&&",0)==0)		//c'est une ligne qui contient un nom de fichier
    			{
    				ReadFileNameInLine(sLine,sTemp);	// extraction du nom du fichier
     
    				oFileNamesArray.Add(m_ImageDirectory + '\\' + sTemp);
     
    				iLinesNumber ++;
    			}
    			sLine = "";	//on efface la ligne dans tous les cas
    		}
    		else
    			sLine.Insert(0,cCurrentChar);
     
    		iShiftFromEnd--;
    	}
     
    	f.Close();

  2. #2
    Invité
    Invité(e)
    Par défaut
    Donc, pour résumer: ton code fonctionne sur un fichier statique mais pas dynamique (en train d'être écrit).

    Ca devrait te mettre la puce à l'oreille: A ton avis le Seek() il est placé sur le pointeur de lecture ou d'écriture ? Car il faut savoir qu'il y a deux pointeurs quand tu joues avec n'importe quelle libstream.

    J'essaie de te mettre sur la voie: je n'ai pas exécuté ton code. Au fait:
    Je préfère ca:

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    je rajouterais CFile::shareDenyWrite a l'open.
    ensuite je ferais un catch sur le seek voir (CFileException
    et je reouvrerais le fichier en cas d'erreur ...

  4. #4
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Merci pour vos réponses.

    Citation Envoyé par rockthat
    Donc, pour résumer: ton code fonctionne sur un fichier statique mais pas dynamique (en train d'être écrit).
    Tout à fait.

    Citation Envoyé par rockthat
    Car il faut savoir qu'il y a deux pointeurs quand tu joues avec n'importe quelle libstream.
    Bon, ça je ne le savais pas. Le problème viendrait donc de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	f.Seek(iShiftFromEnd,CFile::end);
    Citation Envoyé par rockthat
    Au fait [...]
    Ok c'est noté.

    Citation Envoyé par farscape
    salut,
    je rajouterais CFile::shareDenyWrite a l'open.
    Ca je n'ai pas le droit, l'écriture doit être prioritaire sur la lecture.
    Justement, je viens de rajouter CFile::shareDenyNone...
    A la limite, si la lecture se passe mal, on sort calmement de la fonction et on attend le prochain appel (toutes les 5 secondes)

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    il faut donc que tu catch le seek ...

  6. #6
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Alors j'ai essayé deux choses :
    - le try/catch pour la fonction seek
    - positionner le pointeur à la fin et ne plus utiliser CFile::end à chaque boucle.
    Depuis le try/catch, Je n'ai plus le message d'erreur, par contre je n'avance plus non plus dans la suite de la fonction.

    Voici à quoi ressemble le code maintenant :
    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
    CFile f;
    	CFileException e;
    	CString sLine;
    	int iLinesNumber = 0;
    	bool bError =false;
     
    	if(!f.Open(sLogFilePath,CFile::modeRead | CFile::shareDenyNone,&e))
    		return -1;
     
    	int iShiftFromEnd = -1;
    	char cCurrentChar = ' ';
    	CString sTemp;
    	CStringArray oFileNamesArray;
    	oFileNamesArray.RemoveAll();
    	f.Seek(0,CFile::end);
     
    	while(iLinesNumber < m_MaxDefect && !bError)	//on lit chaque ligne du fichier en partant de la fin
    	{
    		try
    		{
    			f.Seek(iShiftFromEnd,CFile::current);
    			if(f.Read(&cCurrentChar,1) == 0)
    				bError = TRUE;
    		}
    		catch (CFileException* e)
    		{
    			return -1;
    		}
     
    		if(cCurrentChar == '\n')			//fin d'une ligne
    		{
    			if(sLine.Find("&&&",0)==0)		//c'est une ligne de défaut
    			{
    				ReadFileNameInLine(sLine,sTemp);	// extraction du nom du fichier
     
    				oFileNamesArray.Add(m_ImageDirectory + '\\' + sTemp);
     
    				iLinesNumber ++;
    			}
    			sLine.Empty();	//on efface la ligne dans tous les cas
    		}
    		else
    			sLine.Insert(0,cCurrentChar);
     
    		iShiftFromEnd--;
    	}
     
    	f.Close();

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    ça serait pas iShiftFromEnd-=2;
    pour tenir compte de la lecture ?

  8. #8
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par farscape
    ça serait pas iShiftFromEnd-=2;
    pour tenir compte de la lecture ?
    Ca serait étonnant , puisque ça fonctionne avec -1 et un fichier statique.
    :

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    en fait c'est plutot -2 direct .

  10. #10
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Effectivement, ça marche mieux !

    Merci

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/03/2008, 18h11
  2. Réponses: 1
    Dernier message: 24/01/2008, 13h20
  3. Message d'erreur - utilisation de paramètres
    Par crapouye dans le forum Oracle
    Réponses: 9
    Dernier message: 14/01/2008, 13h36
  4. Réponses: 3
    Dernier message: 30/03/2007, 14h48
  5. Message d'erreur lors d'utilisation d'un Objet
    Par dirty_boy dans le forum Langage
    Réponses: 3
    Dernier message: 28/10/2005, 16h16

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