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