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 :

prblme de lecture avec fread ... etrange...


Sujet :

MFC

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut prblme de lecture avec fread ... etrange...
    bonjour, bon je suis sur en presence d'un probleme que je ne comprend pas... c'est pourquoi je demande l'avis d'un regard exterieur car j'ai du omettre de faire kekechose d'evident masi je ne parvient pas a trouver la solution ....
    voici 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    if(GetOpenFileName (&of) != 0)
    {
       if((lp_hFile = _wfopen(szFileName,TEXT("rt"))) == NULL)
       {
          if(!strErrMsg.IsEmpty())
             strErrMsg += _T("Error opening file\n");
          else
             strErrMsg = _T("Load() : Error opening file\n");
          result = false;
       }
    }
    else//cancel or error
    {
       strErrMsg.Format(_T("Load() : Error user cancel"));
       result = false;
    }
     
    if(fread(&iLength,sizeof(int),1,lp_hFile) < 1)
    {
       if(!strErrMsg.IsEmpty())
          strErrMsg += _T("Error reading \n");
       else
          strErrMsg = _T("Load() : Error \n");
       result = false;
    }
     
    str.Format(_T("%d"),iLength);
    AfxMessageBox(str,MB_OK);
     
    if(fread(strToRead,iLength,1,lp_hFile) < 1) // ICI CA BLOQUE plu rien plantage
    {
       if(!strErrMsg.IsEmpty())
          strErrMsg += _T("Error reading MS2 header\n");
       else
          strErrMsg = _T("Load() : Error reading MS2 header\n");
       result = false;
    }
    voici le contenu du fichier pointee par szFileName :

    09 00 00 00 09 00 00 00 54 68 75 72 73 64 61 79 2C 00 en hexa

    pour ceux qui parlent pas l'hexa couramment ca donne:

    "<un entier qui donne la taille de la chaine qui suit>Thursday,0"

    bon voila et pour savoir ou je veut en venir avec ca, ben tout simplement

    lire "Thursday," et l'afficher a l'ecran. J'ai bien fait gaffe d'ecrire en mode "t"

    j'arrive a recupere la taille de la chaine (9) et a l'afficher mais c'est tout...

    donc voila si klkun voit une grosse betises ben je le remercie d'avance
    a bientot

  2. #2
    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,
    c'est quoi le type de strToRead ?
    c'est pas une CString j'espere ,sinon c'est normal que ça plante.
    si tu veux travailler en unicode avec un fichier Stream et les MFC
    utilise la classe CStdioFile .


  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    merci,

    mais j'ai cru comprendre en lisant l'aide que CStdioFile est assez limiter pour mon cas ...

    MFC for Windows CE does not support the following methods of the standard MFC CStdioFile class:

    CStdioFile::ReadString
    CStdioFile::WriteString
    CStdioFile::CFile
    CStdioFile::Abort
    CStdioFile::Flush
    CStdioFile::Close
    CStdioFile::Read
    CStdioFile::Write
    CStdioFile::LockRange
    CStdioFile::UnlockRange
    CStdioFile::GetPosition
    CStdioFile::Open
    CStdioFile:uplicate
    In addition, MFC for Windows CE does not support the CStdioFile::m_pStream data member.

    en gros a part ouvrir un fichier je peut pas faire grand chose ... ?

    bon je continue mes recherche et je rajoute comme infos que strToRead est un de type char * ...

    a bientot...

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    ah oui est aussi voici comment j'ecris dans le fichier ca peut vous aider...:

    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
     
    USES_CONVERSION;
     
    // T2A coverts from TCHAR to ANSI.
    //CString str
    char* string = T2A(str.GetBuffer(0));
     
    // Write out the length of the string.
    int length = strlen(string);
    fwrite(&length,sizeof(length),1,lp_hDestFile);
     
    // Write the string out.
    fwrite(string,sizeof(char),length,lp_hDestFile);
     
    // Need to call ReleaseBuffer() to allow the CString object
    // to be called safely.
    str.ReleaseBuffer();
    voila comme j'utilise une conversion des fois c'est ca ki fou la pagaille mais je pense pas...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    As-tu le même problème si tu ouvres ton fichier en mode binaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if((lp_hFile = _wfopen(szFileName,TEXT("rb"))) == NULL)
    Car en mode texte, les fonctions de lecture interprête la séquence CTRL+Z comme fin de fichier

    Je fais un test de mon côté

    Par contre je constate aussi que ton fichier est
    09 00 00 00 09 00 00 00 54 68 75 72 73 64 61 79 2C 00 en hexa
    Donc tu as un premier entier 32bits qui vaut 9
    Tu as ensuite un second entier 32bits qui vaut aussi 9
    Ensuite tu as le texte Thursday

    Ton programme va lire le nombre 9 (09 00 00 00) puis il va lire 9 caractères après (09 00 00 00 54 68 75 72 73)
    les deux premiers caractères lu sont une tabulation suivie du fin du caractère de fin chaîne.

  6. #6
    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,
    et be effectivement .
    ce que je ne comprends pas c'est que si CE ne supporte pas CStdioFile::Read ,extrait ci-dessous:
    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
     
    UINT CStdioFile::Read(void* lpBuf, UINT nCount)
    {
    	ASSERT_VALID(this);
    	ASSERT(m_pStream != NULL);
     
    	if (nCount == 0)
    		return 0;   // avoid Win32 "null-read"
     
    	ASSERT(AfxIsValidAddress(lpBuf, nCount));
     
    	UINT nRead = 0;
     
    	if ((nRead = fread(lpBuf, sizeof(BYTE), nCount, m_pStream)) == 0 && !feof(m_pStream))
    		AfxThrowFileException(CFileException::generic, _doserrno, m_strFileName);
    	if (ferror(m_pStream))
    	{
    		clearerr(m_pStream);
    		AfxThrowFileException(CFileException::generic, _doserrno, m_strFileName);
    	}
    	return nRead;
    }
    alors il ne doit pas supporter fread et donc le mode stream.
    puisque CStdioFile::Read utilise fread...

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Madeiras
    Bonjour,

    As-tu le même problème si tu ouvres ton fichier en mode binaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if((lp_hFile = _wfopen(szFileName,TEXT("rb"))) == NULL)
    Car en mode texte, les fonctions de lecture interprête la séquence CTRL+Z comme fin de fichier

    Je fais un test de mon côté

    Par contre je constate aussi que ton fichier est
    09 00 00 00 09 00 00 00 54 68 75 72 73 64 61 79 2C 00 en hexa
    Donc tu as un premier entier 32bits qui vaut 9
    Tu as ensuite un second entier 32bits qui vaut aussi 9
    Ensuite tu as le texte Thursday

    Ton programme va lire le nombre 9 (09 00 00 00) puis il va lire 9 caractères après (09 00 00 00 54 68 75 72 73)
    les deux premiers caractères lu sont une tabulation suivie du fin du caractère de fin chaîne.
    oui j'ai le meme probleme en binary, de plus j'ai enlever le premier entier car je m'en suis rendu compte aussi kil y etait 2 fois....

    mais j'utilise CE donc je c aps si tu peux tester ca ???

    bref j'essaie avec CFile la pour voir ce ke ca donne...

    merci du coup de main

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par farscape
    salut,
    et be effectivement .
    ce que je ne comprends pas c'est que si CE ne supporte pas CStdioFile::Read ,extrait ci-dessous:
    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
     
    UINT CStdioFile::Read(void* lpBuf, UINT nCount)
    {
    	ASSERT_VALID(this);
    	ASSERT(m_pStream != NULL);
     
    	if (nCount == 0)
    		return 0;   // avoid Win32 "null-read"
     
    	ASSERT(AfxIsValidAddress(lpBuf, nCount));
     
    	UINT nRead = 0;
     
    	if ((nRead = fread(lpBuf, sizeof(BYTE), nCount, m_pStream)) == 0 && !feof(m_pStream))
    		AfxThrowFileException(CFileException::generic, _doserrno, m_strFileName);
    	if (ferror(m_pStream))
    	{
    		clearerr(m_pStream);
    		AfxThrowFileException(CFileException::generic, _doserrno, m_strFileName);
    	}
    	return nRead;
    }
    alors il ne doit pas supporter fread et donc le mode stream.
    puisque CStdioFile::Read utilise fread...
    pourtant j'utilise fread pour lire le premier entier "9" et la fonction marche.. et j'utilise fread dans d'autre methode pour lire des donnees (pas des chaines) et ca mache.. bizarre tout ca ...

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Points : 40
    Points
    40
    Par défaut
    Je me pose la même question que farscape

    c'est quoi le type de strToRead ?
    Si le type de strToRead est CString alors il y a une erreur de compilation car le compilateur ne sait pas convertir un type CString en void * dans la fonction fread

    La fonction fread s'attend à recevoir un pointeur
    => lorsque tu veux lire un entier, un écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fread(&iLength,sizeof(int),1,lp_hFile)
    avec le symbole & pour passer la variable iLength par adresse.

    Si le type de strToRead est char * tout simplement, tu auras un plantage à l'exécution car tu déclares un pointeur de type char vers une "zone" mémoire non allouée => tu veux mettre le résultat de la lecture "quelque part" en mémoire.

    Si le type de strToRead est char strToRead[512], tu déclares un vecteur de 512 char et normalement la lecture devrait passer.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    strToRead --> char *

    Bon j'ai essayer ce 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
     
    	CString szSectionTitle = (L"La tartiflette ca dechire !!!");
    	CString szFileName = (L"unFichier.dat");
    	LPTSTR szResult ;
    	char *pmbbuf = new char[100];//(char *)malloc(2000);
     
    	CFile Fout(szFileName, CFile::modeCreate | CFile::modeWrite | CFile::modeRead); 
     
    	wcstombs( pmbbuf, szSectionTitle, 100 ); 
    	Fout.Write(pmbbuf, szSectionTitle.GetLength());
     
    	Fout.Read(pmbbuf,szSectionTitle.GetLength());
     
    	mbstowcs(szResult,pmbbuf,100);
    	AfxMessageBox(szResult,MB_OK);
    ca ecrit bien dans le fichier mais pour la lecture ca me donne un message : "Access to an unamed file was denied."

    donc la ... je c pas koi vous dire....

  11. #11
    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
    oui mais soit plus precis:
    strToRead --> char *
    la declaration please .
    parce que si c'est
    c'est pas etonnant.


  12. #12
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    eh oui ....
    je viens de m'en rendre compte.. du coup correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    char * strToRead = new char[100];
    //...
    if(fread(strToRead,iLength,1,lp_hFile) < 1)
    		{
    			if(!strErrMsg.IsEmpty())
    				strErrMsg += _T("Error read\n");
    			else
    				strErrMsg = _T("Load() : Error read\n");
    			result = false;
    		}
    et la ca marche, mais j'ai un autre prblm maintenant c'est ke les caracteres ke je lis sont illisibles....
    ca je sais encore aps pkoi...
    merci de votre aide en tout cas

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Points : 40
    Points
    40
    Par défaut
    Pour le 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
     
    CString szSectionTitle = (L"La tartiflette ca dechire !!!"); 
       CString szFileName = (L"unFichier.dat"); 
       LPTSTR szResult ; 
       char *pmbbuf = new char[100];//(char *)malloc(2000); 
     
       CFile Fout(szFileName, CFile::modeCreate | CFile::modeWrite | CFile::modeRead); 
     
       wcstombs( pmbbuf, szSectionTitle, 100 ); 
       Fout.Write(pmbbuf, szSectionTitle.GetLength()); 
     
       Fout.Read(pmbbuf,szSectionTitle.GetLength()); 
     
       mbstowcs(szResult,pmbbuf,100); 
       AfxMessageBox(szResult,MB_OK);
    La seule chose que je peux dire, c'est que tu écris un buffer, tu te trouves par la suite en fin de fichier, après tu veux probablement relire ce que tu viens d'écrire mais comme tu es en fin de fichier çà ne va pas, tu dois alors utiliser la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fout.SeekToBegin()
    pour te remettre en début de fichier pour relire ton buffer.

    Mais as-tu essayer ton premier extrait de code avec la modif suivante:

    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
     
    // Modif de Madeiras
    char strToRead[100]; // au lieu de char *strToRead;
     
    if(GetOpenFileName (&of) != 0) 
    { 
       if((lp_hFile = _wfopen(szFileName,TEXT("rt"))) == NULL) 
       { 
          if(!strErrMsg.IsEmpty()) 
             strErrMsg += _T("Error opening file\n"); 
          else 
             strErrMsg = _T("Load() : Error opening file\n"); 
          result = false; 
       } 
    } 
    else//cancel or error 
    { 
       strErrMsg.Format(_T("Load() : Error user cancel")); 
       result = false; 
    } 
     
    if(fread(&iLength,sizeof(int),1,lp_hFile) < 1) 
    { 
       if(!strErrMsg.IsEmpty()) 
          strErrMsg += _T("Error reading \n"); 
       else 
          strErrMsg = _T("Load() : Error \n"); 
       result = false; 
    } 
     
    str.Format(_T("%d"),iLength); 
    AfxMessageBox(str,MB_OK); 
     
    if(fread(strToRead,iLength,1,lp_hFile) < 1) // ICI CA BLOQUE plu rien plantage 
    { 
       if(!strErrMsg.IsEmpty()) 
          strErrMsg += _T("Error reading MS2 header\n"); 
       else 
          strErrMsg = _T("Load() : Error reading MS2 header\n"); 
       result = false; 
    }

  14. #14
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    C'est bon en fait au lieu de :

    j'ai mis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *strToRead = new char[100];
    et pour ce ki est des caracteres non lisible j'ai rajouter une conversion histoire de..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    LPTSTR str1;
    mbstowcs( str1,strToRead,100);
    AfxMessageBox(str1,MB_OK);
    et tout marche ouf...
    Merci merci merci bokou !

  15. #15
    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
    si c'est ok ,n'oublie pas de cocher resolu

Discussions similaires

  1. Problème de Lecture avec fread, feof retourne 16
    Par neoangelo5 dans le forum C
    Réponses: 10
    Dernier message: 14/04/2011, 16h37
  2. Réponses: 2
    Dernier message: 11/05/2010, 10h27
  3. lecture avec fread()
    Par salsabouge dans le forum Langage
    Réponses: 18
    Dernier message: 20/10/2008, 17h51
  4. problème lecture avec fread
    Par xeron33 dans le forum C
    Réponses: 1
    Dernier message: 19/06/2008, 00h04
  5. Lecture avec fread()
    Par cout dans le forum C
    Réponses: 33
    Dernier message: 15/06/2006, 22h50

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