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 :

ajouter des données à la fin des lignes d'un fichier


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 50
    Par défaut ajouter des données à la fin des lignes d'un fichier
    Bonjour,
    je construis le fichier suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #define index_V		0
    #define index_cajsr
    #define index_camyo
    #define index_cansr
    #define index_cass
    #define index_htrpnCa
    #define index_kin
    #define index_ltrpnCa
    #define index_nain
    #define index_pryr
    et je voudrai savoir comment faire pour ajouter des numéros à la fin de chaque ligne en partant de la 2ième. Finalement ça donnerait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #define index_V		0
    #define index_cajsr		1
    #define index_camyo		2
    #define index_cansr		3
    #define index_cass		4
    #define index_htrpnCa		5
    #define index_kin		6
    #define index_ltrpnCa		7
    #define index_nain		8
    #define index_pryr		9
    Voici la fonction que j'ai écrite pour rajouter les numéros, mais elle les ajoute après la dernière ligne :
    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
     
     
    void Ecriture::ecrire_chif(string fs)
    {
    	ifstream fichier_lect(fs.c_str());
    	ofstream fichier_ecri(fs.c_str(), std::ios_base::app);
    	string s;
    	int i = 0;
    	int cptr = 0;
     
    	while (getline (fichier_lect,s)) i++; // nombre de lignes du fichier
     
    	for (cptr=1; cptr<i; cptr++)
    	{
    		fichier_ecri.seekp(cptr, std::ios_base::beg);
    		fichier_ecri <<"\t\t"<<cptr<<endl;/* ajoute des tabulations et le numéros de la ligne, mais seulement après la dernière ligne du fichier */
    	}
    	fichier_ecri.close();
    	fichier_lect.close();
    }
    J'ai l'impression que la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fichier_ecri.seekp(cptr, std::ios_base::beg);
    ne me place pas au début.
    Voilà, si vous avez une idée, merci d'avance !!

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    en ce qui me concerne, j'aurais préféré faire ça autrement. A savoir:
    1) mettre l'intégralité du fichier dans une string
    2) modifier ma string (soit à l'aider de replace(), soit à l'aide de insert() )
    3) copier la string modifiée dans le fichier en écrasant ce qu'il y avait avant.

    Ce qui donnerait quelque chose comme ça:
    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
    void ecrire_chif(string fs)
    {
    	ifstream file_in( fs.c_str() );
    	std::stringstream buffer;
     
    	buffer << file_in.rdbuf();
    	file_in.close();
    	string str = buffer.str();
     
    	size_t pos = 0;
    	int count = 0;
    	do
    	{
    		pos = str.find('\n', pos);
    		if (pos != string::npos)
    		{
    			ostringstream oss;
    			oss << "\t\t" <<count++;
    			str.insert( pos, oss.str() );
    			pos = str.find('\n', pos) + 1;
    		}
    	} 
    	while (pos != string::npos);
     
    	ofstream file_out( fs.c_str(), ios_base::beg );
    	file_out << str;
    	file_out.close();
    }
    Hope it helps.

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Encore plus facile :
    - Lire chaque ligne et les placer dans un tableau
    - Récrire les lignes + le chiffre qui va bien

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Ha oui, exact. En plus ça nous permet d'avoir un meilleur contrôle sur le contenu des lignes (pour ignorer les lignes vides par exemple).
    Ca pourrait ressembler à 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
    18
    19
    20
    21
    22
    23
    void ecrire_chif(string fs)
    {
    	ifstream file_in( fs.c_str() );
    	vector<string> vs;
    	string tmpStr;
     
    	while ( getline( file_in, tmpStr) )
    	{
    		vs.push_back(tmpStr);
    	}
    	file_in.close();
     
    	ofstream file_out( fs.c_str(), ios::beg );
    	int count = 0;
    	for (vector<string>::const_iterator it = vs.begin(); it != vs.end(); it++)
    	{
    		if ( !it->empty() )
    		{
    			file_out << (*it) << "\t\t" << count++ << "\n";
    		}
    	}
    	file_out.close();
    }

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Par contre avec un fichier trés gros (je pense pô que se soit le cas, mais on sait jamais), je pense qu'il faudra utiliser un fichier temporaire de sortie et de traiter le fichier ligne par ligne. Ce qui reviens au même, sans passé par un tableau.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 50
    Par défaut
    Merci pour ces nombreuses réponses !!
    J'ai essayé le dernier code de r0d en l'adaptant à mon programme mais j'avais une erreur, je pensais que j'avais fait quelque chose de travers, mais avec le code d'origine j'ai la même erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    error: no matching function for call to `
       std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(const 
       char*, const std::_Ios_Seekdir&)'
    /usr/include/gcc/darwin/3.3/c++/iosfwd:92: error: candidates are: 
       std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(const 
       std::basic_ofstream<char, std::char_traits<char> >&)
    /usr/include/gcc/darwin/3.3/c++/fstream:639: error:                 
       std::basic_ofstream<_CharT, _Traits>::basic_ofstream(const char*, 
       std::_Ios_Openmode = (std::ios_base::out | std::ios_base::trunc)) [with 
       _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/gcc/darwin/3.3/c++/fstream:622: error:                 
       std::basic_ofstream<_CharT, _Traits>::basic_ofstream() [with _CharT = char, 
       _Traits = std::char_traits<char>]
    C'est la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ofstream file_out( fs.c_str(), ios::beg );
    qui pose problème. Pourtant j'ai déjà utilisé cette instruction et je ne vois pas ce qui cloche.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/04/2012, 20h49
  2. Réponses: 6
    Dernier message: 22/03/2012, 12h24
  3. Réponses: 6
    Dernier message: 13/12/2010, 20h20
  4. Réponses: 2
    Dernier message: 06/06/2010, 15h15
  5. Réponses: 5
    Dernier message: 17/06/2008, 15h38

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