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

Visual C++ Discussion :

ReadFile et CString


Sujet :

Visual C++

  1. #1
    Membre �clair�
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : Directeur de projet
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Par d�faut ReadFile et CString
    Bonjour � tous.
    Mon probl�me est le suivant :
    J'aimerais �crire une CString � une ligne donn�e : pour cela, je fais ceci :
    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
     
    bool CCalibFile::WriteString(CString string, int line)
    {
    	CStdioFile f_calib;
    	char nom[20];
    	int i;
    	CString str;
     
    	f_calib.Open("calib.txt",CFile::modeWrite |CFile::modeRead | CFile::shareDenyWrite |CFile::typeText);// | CFile::modeNoTruncate);
    	f_calib.SeekToBegin();
    	for (i=1;i<line;i++) {
    		f_calib.ReadString(str);
    	}
    	f_calib.WriteString(string);
    	f_calib.Close();
    	return true;
    }
    Le principe est simple : je saute de ligne le nombre qu'il faut, puis j'�cris � ce niveau.

    Ce que je ne comprend pas, c'est pourquoi le programme plante sur le ReadString au deuxi�me passage de la boucle...
    Est-ce parceque on n'a pas le droit de r��crire sur la CString str ?

    M�me plant�, je "force", et je vois qu'il a �crit au debut de la premi�re ligne.
    Mais Keskessaveudirequessa?

    Merci pour vos r�ponses �clairantes comme toujours

  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
    Par d�faut
    salut ,
    quel est le message d'erreur ?,
    sinon la raison que je vois : ton nombre de lignes (line) est sup�rieur a ce que peut lire ReadString() ...
    il serait bien de tester le retour de ReadString .

  3. #3
    Membre �clair�
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : Directeur de projet
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Par d�faut
    Merci Farscape pour ta r�ponse.

    Voici l'erreur obtenue:
    CFile exception: generic, File z:\home\pierre\Visual Studio Projects\reglin\reglin\calib.txt, OS error information = 0.
    First-chance exception at 0x7c812a5b in reglin.exe: Microsoft C++ exception: CFileException @ 0x0012d87c.
    Unhandled exception at 0x7c812a5b in reglin.exe: Microsoft C++ exception: CFileException @ 0x0012d87c.
    Et je me retrouve dans le fichier filex.cpp � la ligne 119 avec 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
     
    void __declspec(noreturn) AFXAPI AfxThrowFileException(int cause, LONG lOsError,
    	LPCTSTR lpszFileName /* == NULL */)
    {
    #ifdef _DEBUG
    	LPCSTR lpsz;
    	if (cause >= 0 && cause < _countof(rgszCFileExceptionCause))
    		lpsz = rgszCFileExceptionCause[cause];
    	else
    		lpsz = szUnknown;
    	TRACE(traceAppMsg, 0, _T("CFile exception: %hs, File %s, OS error information = %ld.\n"),
    		lpsz, (lpszFileName == NULL) ? _T("Unknown") : lpszFileName, lOsError);
    #endif
    	THROW(new CFileException(cause, lOsError, lpszFileName));
    }
    Comme je ne comprenais absolument rien � l'erreur (comme d'hab ), j'ai chang� l'ouverture du fichier.
    Si je l'ouvre en mode uniquement Read ou modeReadWrite, je n'ai plus d'erreur.
    Par contre, le WriteString ne se fait pas : string vaut ce que je veux, mais il n'est pas �crit dans le fichier.

    M�koihalafaim ?
    Merci

  4. #4
    Membre �clair�
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : Directeur de projet
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Par d�faut
    Bon, j'ai modifi� tout �a : plut�t que d'�crire directement dans le fichier, voici ce que je fais :
    1�) Ouverture en mode lecture du fichier � changer
    2�) Overture en mode �criture d'un autre fichier
    3�) Recopie ligne par ligne du fichier 1 dans le fichier 2 (sauf celle qu'il faut changer )
    3�) Fermeture des 2 fichiers
    4�) Suppression du fichier 1
    5�) Move du fichier 2 vers le fichier 1

    Voici donc le code pour ceux que ca interresse :
    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
     
    bool CTableFile::WriteString(CString string, int line)
    {
    	CStdioFile f_table1;
    	CStdioFile f_table2;
    	char nom_or[20];
    	char nom_fin[20];
    	int i = 1;
    	CString str;
     
    	sprintf(nom_or,"table%d_%d.txt",voie,table);
    	sprintf(nom_fin,"table%d_%d_1.txt",voie,table);
    	f_table1.Open(nom_or,CFile::modeRead |CFile::typeText);// | CFile::modeWrite | CFile::modeNoTruncate);
    	f_table2.Open(nom_fin,CFile::modeWrite |CFile::modeCreate|CFile::typeText);// | CFile::modeWrite | CFile::modeNoTruncate);
     
    	f_table1.SeekToBegin();
    	f_table2.SeekToBegin();
     
    	while(f_table1.ReadString(str)) {
    		if (i != line) {
    			f_table2.WriteString(str);
    			f_table2.WriteString("\n");
    		} else {
    			f_table2.WriteString(string);
    			f_table2.WriteString("\n");
    		}
    		++i;
    	}
    	f_table1.Close();
    	f_table2.Close();
    	DeleteFile(nom_or);
    	MoveFileEx(nom_fin,nom_or,MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING);
    	return true;
    }
    Et voil�, ca fonctionne !!
    Sans doute y-a-til plus beau, mais je sais pas comment m'y prendre alors

  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
    Par d�faut
    salut,
    tu pourrais utiliser la methode Format de la classe CString en lieu et place de sprintf.
    �a t'eviterais d'utiliser des chaines de char et d'enventuels d�bordement m�moire.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    CString nom_or;
    nom_or.Format("table%d_%d.txt",voie,table);

  6. #6
    Membre �clair�
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2006
    Messages
    245
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : Directeur de projet
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Juin 2006
    Messages : 245
    Par d�faut Certes, mais avec 45000 lignes ?
    Effectivement, Farscape, c'est mieux ainsi. Merci pour cette pr�cision.

    Pour aller un tout petit peu plus loin, j'aurais voulu savoir si il n'y a aps une meilleure m�thode pour modifier une seule ligne d'un fichier.
    En effet, je dois cr�er un fichier de sauvegarde dans lequel, toutes les 5 minutes, je sauvegarde des r�sultats.
    Ce fichier est une sorte de FIFO de dur�e de vie d'un mois, soit 45000 lignes environ...
    Je pense que cette m�thode risque donc de prendre beaucoup de temps pour un tel fichier : n'y a-t-il pas mieux ?

    Merci d'avance pour vos r�ponses

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. "conversion" _variant_t en CString
    Par kam dans le forum MFC
    R�ponses: 4
    Dernier message: 09/03/2005, 17h41
  2. conversion : VARIANT FAR* URL vers CString
    Par kam dans le forum MFC
    R�ponses: 2
    Dernier message: 29/03/2004, 13h32
  3. [MFC][WinCE] Longueur maxi de CString?
    Par Sunny dans le forum MFC
    R�ponses: 3
    Dernier message: 28/01/2004, 14h40
  4. R�ponses: 2
    Dernier message: 21/01/2004, 17h59
  5. Convertion de type VARIANT � type CString
    Par j_grue dans le forum MFC
    R�ponses: 2
    Dernier message: 07/11/2002, 14h18

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