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 :

ecriture au milieu d'un fichier


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 161
    Par défaut ecriture au milieu d'un fichier
    Bonjour a tous,

    Je suis entrain de programmer une application qui écrit dans un fichier avec c++
    j'utilise la classe CFile.

    J'ai créer au début un fichier sous cette forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Fichier type 1:
     
    Fichier type 2:
     
    Fichier type 3:
    puis je désire ajouter dans le fichier les nom des fichiers pour chaque type. il de vient sous cette forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Fichier type 1:
    Fichier 1
    Fichier 2
    Fichier type 2:
    Fichier 3
    Fichier 4
    Fichier type 3:
    Fichier 5
    Fichier 6
    le problème c'est lorsque j'ajoute une ligne celle qui est déjà écrite s'efface. Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Fichier type 1:
    Fichier 1
    er type 2:
    Le code de ma classe est le suivant:
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    CErrorManager.h
    
    class CErrorManager
    {
    private:
    	int m_nUnDecryptedFilesIndex;
    	int m_nUnverifiedFilesIndex;
    	int m_nUnvalidNistFilesIndex;
    	bool m_bInitialize;
    	CFile m_fLogFile;
    public:
    	CErrorManager(void);
    	~CErrorManager(void);
    
    	void open_log_file(CString l_strErrorFile);
    	void add_undecrypted_file(CString l_strErrorFile, CString l_strUndecryptedFileName);
    	void add_unverified_file(CString l_strErrorFile, CString l_strUnverifiedFileName);
    	void add_unexploitable_file(CString l_strErrorFile, CString l_strUnexploitableFileName);
    	void close_log_file(CString l_strErrorFile);
    };
    
    CErrorManager.cpp
    
    CErrorManager::CErrorManager()
    {
    	m_nUnDecryptedFilesIndex = 0;
    	m_nUnverifiedFilesIndex = 0;
    	m_nUnvalidNistFilesIndex = 0;
    	m_bInitialize = false;
    }
    
    CErrorManager::~CErrorManager(void)
    {
    }
    
    void CErrorManager::open_log_file(CString l_strErrorFile)
    {
    	CFileException fileException;
    	char l_szBuffer[256];
    	if ( !m_fLogFile.Open( l_strErrorFile, CFile::modeCreate | 
    		CFile::modeNoTruncate, &fileException ) )
    	{
    		TRACE( "Can't open file %s, error = %u\n",
    			l_strErrorFile, fileException.m_cause );
    	}
    	strcpy(l_szBuffer,"Fichiers non déchiffrés :\n");
    	m_fLogFile.Write(l_szBuffer, strlen(l_szBuffer));
    	m_nUnDecryptedFilesIndex = m_nUnDecryptedFilesIndex + strlen(l_szBuffer);
    	strcpy(l_szBuffer,"\nFichiers refusés :\n");
    	m_fLogFile.Write(l_szBuffer, strlen(l_szBuffer));
    	m_nUnverifiedFilesIndex = m_nUnDecryptedFilesIndex + strlen(l_szBuffer);
    	strcpy(l_szBuffer,"\nFichiers inexploitables :\n");
    	m_fLogFile.Write(l_szBuffer, strlen(l_szBuffer));
    	m_nUnvalidNistFilesIndex = m_nUnverifiedFilesIndex + strlen(l_szBuffer);
    }
    
    void CErrorManager::add_undecrypted_file(CString l_strErrorFile, CString l_strUndecryptedFileName)
    {
    	if ( m_bInitialize == false)
    	{
    		open_log_file (l_strErrorFile);
    		m_bInitialize = true;
    	}
    	m_fLogFile.Seek(m_nUnverifiedFilesIndex,CFile::begin);
    	m_fLogFile.Write(l_strUndecryptedFileName + "\n", l_strUndecryptedFileName.GetLength()+1);
    	m_nUnDecryptedFilesIndex += l_strUndecryptedFileName.GetLength()+1;
    	m_nUnverifiedFilesIndex += l_strUndecryptedFileName.GetLength()+1;
    	m_nUnvalidNistFilesIndex += l_strUndecryptedFileName.GetLength()+1;
    }
    
    void CErrorManager::add_unverified_file(CString l_strErrorFile, CString l_strUnverifiedFileName)
    {
    	int x = 0;
    	x = l_strUnverifiedFileName.GetLength();
    	if ( m_bInitialize == false)
    	{
    		open_log_file (l_strErrorFile);
    		m_bInitialize = true;
    	}
    	m_fLogFile.Seek(m_nUnverifiedFilesIndex,CFile::begin);
    	m_fLogFile.Write(l_strUnverifiedFileName + "\n", l_strUnverifiedFileName.GetLength()+1);
    	m_nUnverifiedFilesIndex += l_strUnverifiedFileName.GetLength()+1;
    	m_nUnvalidNistFilesIndex += l_strUnverifiedFileName.GetLength()+1;
    }
    
    void CErrorManager::add_unexploitable_file(CString l_strErrorFile, CString l_strUnexploitableFileName)
    {
    	if ( m_bInitialize == false)
    	{
    		open_log_file (l_strErrorFile);
    		m_bInitialize = true;
    	}
    	m_fLogFile.Seek(m_nUnvalidNistFilesIndex,CFile::begin);
    	m_fLogFile.Write(l_strUnexploitableFileName + "\n", l_strUnexploitableFileName.GetLength()+1);
    	m_nUnvalidNistFilesIndex += l_strUnexploitableFileName.GetLength()+1;
    }
    
    void CErrorManager::close_log_file(CString l_strErrorFile)
    {
    	if (m_fLogFile.Open( l_strErrorFile, CFile::modeCreate | 
    		CFile::modeReadWrite, NULL ) )
    		m_fLogFile.Close();
    }
    Pouvez vous m'indiquer l'erreur.
    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Le fait est qu'un fichier est "gravé dans le marbre"...

    Pour insérer quelque chose à l'intérieur du fichier, il faut "casser la pierre", et tout réécrire.

    Deux solution concurrentes sont possibles:

    Soit tu ouvre le fichier "original" en lecture et un autre fichier "copie" en écriture, tu lis une ligne dans le premier, et tu l'écris dans l'autre.

    Lorsque tu arrive à l'élément à rajouter, tu le rajoute, et tu continue jusqu'à la fin du fichier

    Il ne te "reste plus qu'à" supprimer le fichier d'origine et à renommer le fichier copié.

    La deuxième solution, c'est de charger l'ensemble du fichier d'origine dans un "buffer", d'y apporter les modifications souhaitées, et de réécrire le tout dans le fichier (du moins dans un fichier du meme nom), en veillant à ne pas ouvrir le fichier en mode "append" (ajout), ce qui provoquera la destruction du fichier d'origine et son remplacement automatique.

    Pour le reste, c'est à toi de jouer
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 161
    Par défaut
    Merci,
    j'ai opté pour la deuxième solution.

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Pour être viable la seconde solution doit être modifiée et va ressembler terriblement à la première....

    Je m'explique... dans tous les cas, l'opération sur les fichiers est similaire...
    Disons qu'on veuille modifier le fichier 'A':

    Les données sont en mémoire, et l'OS propose un 'swap' quasi-atomique de fichiers:

    (1) Ecriture de "A_new"
    (2) Swap de "A" et de "A_new"
    (3) Destruction de "A_new"
    Exception en (1) ou (2) => goto (3)

    Les données sont en mémoire, et l'OS ne propose pas un 'swap' de fichiers:

    (1) Copie de "A" en "A_backup"
    (2) Ecriture de "A"
    (3) Destruction de "A_backup"
    Exception en (1) => (3)
    Exception en (2) => copie de "A_backup" en "A", goto (3)


    Les données doivent être lues, et l'OS propose un 'swap' de fichiers:

    (1) Lecture de "A" et écriture de "A_new" comme proposé par Koala
    (2) Swap de "A" et "A_new"
    (3) Destruction de "A_new"
    Exception en (1) ou (2) => goto (3)

    Les données doivent être lues, et l'OS ne propose pas un swap de fichier:

    (1) Copie de "A" en "A_backup" et en même temps, écriture de "A_new"
    (2) Copie de "A_new" sur "A"
    (3) Destruction de "A_new" et "A_backup"
    Exception en (1) => goto (3)
    Exception en (2) => copie de "A_backup" sur "A", goto (3)

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

Discussions similaires

  1. [VBA-E]Ecriture de données dans un fichier texte
    Par osito57 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 18/08/2017, 20h42
  2. Ecriture d'accents dans un fichier
    Par tenshu dans le forum C
    Réponses: 5
    Dernier message: 07/10/2006, 10h26
  3. écrire au milieu d'un fichier texte
    Par papyphp dans le forum Langage
    Réponses: 2
    Dernier message: 30/12/2005, 07h15
  4. Ecriture par caractere dans un fichier.
    Par SaianSupa dans le forum C
    Réponses: 5
    Dernier message: 29/11/2005, 16h31
  5. ecriture caractere null dans un fichier
    Par Mitox dans le forum C
    Réponses: 5
    Dernier message: 08/11/2005, 16h52

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