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 :

Petit soucis avec un fichier txt


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 8
    Points
    8
    Par défaut Petit soucis avec un fichier txt
    Bonjour à tous,

    je suis confronté à un petit soucis en c++ sur un fichier txt.

    J'ai un fichier .txt de la forme suivante :

    2013-03-21 13:52:06 test
    2013-03-21 13:52:07
    2013-03-21 13:52:10 h
    2013-03-21 13:52:57 h
    2013-03-21 13:55:48 subj testcmd

    avec x ligne (recupération de l'instruction qu'un utilisateur tape dans un display)

    je souhaiterais recuperer la fin de la ligne , pour avoir ceci:

    test

    h
    h
    subj testcmd

    mais attention, voila mon soucis, je dois recuperer les 5 derniéres lignes du fichier txt, sachant que je ne connais pas par avance le nombre de ligne total.

    Autre soucis, la taille maximun de mon tableau de string, s'il y a plus de 255 ligne dans le fichier.

    J'ai donc créer un tableau de string qui recupére chaque ligne (et aussi une boucle while qui compte le nombre de ligne total)

    j'arrive bien à afficher la ligne (mais je n'arrive pas à decouper la chaine)

    Si quelqu'un à une idée, voila le bout de code qui me pose soucis.

    (tDisp.setText() dois avoir un type string)


    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
     
     
     
    ifstream monHistory("history.txt");
    			if(monHistory)
    			{
     
    				string cmdHistory;
    				string tbHistory[255];
    				int i = 0;
    				int n= 0; 
     
    				while ( ! monHistory.eof() )
    					{
    						while(getline(monHistory, cmdHistory))
    						{
    							tbHistory[i] = cmdHistory;
    								i++;
    						}
     
    						tDisp.setText("Cmd History", 8,0);
    						tDisp.setText(tbHistory[i-5] , 9 ,0);
    						tDisp.setText(tbHistory[i-4] , 10 ,0); 
    						tDisp.setText(tbHistory[i-3] , 11 ,0); 
    						tDisp.setText(tbHistory[i-2] , 12 ,0);
    						tDisp.setText(tbHistory[i-1] , 13 ,0);
    					}
    			monHistory.close();

    merci beaucoup,
    doc'

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Bonjour,

    Je pense que la fonction strtok_r pourrait t'intéresser.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    bonjour,

    je regarde tout de suite.

    Par contre je vois que strtok_r() fait une sortie de type char et non en string, mais ca je vais voir aprés.

    merci do'c

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    En C++, on a substr et find pour les std::string.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    re-bonjour,

    ha oui j'avais oublié le substr() merci !

    maintenant, il me faut résoudre le soucis de récupérer les 5 dernières lignes de mon fichier .txt Comme je connais pas le nombre max de ligne qu'il y aura dans le fichier (en gros ca fait office de log, sans taille max)

    merci beaucoup doc'

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 053
    Points
    33 053
    Billets dans le blog
    4
    Par défaut
    Bonsoir,
    Tu te focalises trop sur "les 5 dernières alors que je sais pas combien j'en ai", alors que la solution au problème peut être très simple : tu log au fur et à mesure et ne récupères que les 5 dernières
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    std::vector<string> v;
    while()
    {
     std::string s;
     getline(s, file);
     v.push_back(s);
    }
    if (v.size() > 5)
      std::vector<string> last5 = std::vector(v.begin() + v.size() - 5, v.end());
    else
      std::vector<string> last5 = v;
    On peut aussi imaginer une autre voie, on log tout, on inverse le contenu et on prend alors les 5 premières
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::reverse(v.begin(), v.end());
    if (v.size() > 5)
      std::vector<string> last5 = std::vector(v.begin(), v.begin() + 5);
    else
      std::vector<string> last5 = v;
    Ou une version plus technique (non testée), qui n'en log que effectivement 5 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int i = 0;
    std::vector<string> v;
    v.resize(5);
    while()
    {
     getline(v[i++%5], file);
    }

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,
    Citation Envoyé par Bousk Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int i = 0;
    std::vector<string> v;
    v.resize(5);
    while()
    {
     getline(v[i++%5], file);
    }
    Attention, avec cette méthode, tu auras sans doute bien les 5 dernière lignes, mais il y a de fortes chances, si ton fichier ne contient pas un nombre de lignes qui est un multiple de 5, que tu les obtienne dans un ordre assez chaotique (genre: les deux dernière puis les trois premières, ou les quatre dernières puis la première), en fonction du nombre réel de lignes

    Maintenant, si on a la certitude que les lignes iront toujours par cinq, et que le log contiendra d'office N*5 lignes, ca pourrait aller ... Mais a-t-on cette certitude

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 053
    Points
    33 053
    Billets dans le blog
    4
    Par défaut
    Ou que l'on se moque de leur ordre
    Si ça importe, on peut imaginer une structure perso qui réalise un décallage à chaque entrée et supprime ce qui déborde.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 8
    Points
    8
    Par défaut
    Merci pour toutes vos réponses, je les tests dés à présent.


    désolé du temps de réponse, j'ai eu un autre projet qui m'es tombé dessus

    edit: je viens d'essayer vos solutions, mais je n'arrive pas à les mettre en place (je pense que je patauge avec les vectors et les ifstreams)
    sinon j'avais eu une idée, (un peu crade certes) je lis le fichier une fois (je récupère le nb de ligne total) et je le relis une deuxième fois (pour récupérer les lignes que je voudrais)

    Mais pour le moment je rencontre quelques soucis sur le flag après la première boucle.
    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
     
     
     
    int main()
    {
        ifstream monHistory("history.txt");
    		if(monHistory)
    		{
    			string cmdHistory;
    			string tbHistory[10];
    			int i = 0; // nb line total
    			int n = 6; //nb line history
    			int a = 0; //var 
     
     
     
     
    				while ( ! monHistory.eof() )
    				{
    					//count nb line
    					while(getline(monHistory, cmdHistory))
    					{
    						i++;
    					}
    				}
     
     
    monHistory.seekg(0, monHistory.beg()); // raz position
     
    				while ( ! monHistory.eof())
    				{
     
    						//position line to history
    					while(getline(monHistory, cmdHistory))
    					{
    						if ((i-n) <= i)
    						{
    							tbHistory[a] = cmdHistory.substr(20,40);
    							a++;
    						}
    						else
    						{
    						}
    						cout << "historique" << endl ;
    						cout << tbHistory[a-1] << endl ;
    					}
    				}
     
     
     
    		monHistory.close();
     
     
    		}
    		else 
    		{
    		cout << "Fail to open history.txt" << endl;
        	}
    		system("pause");
    		return 0;
     
    }

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

Discussions similaires

  1. Petit souci avec deux fichiers
    Par Dawlon dans le forum WinDev
    Réponses: 8
    Dernier message: 01/06/2012, 09h45
  2. petit soucis avec les listes
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/09/2005, 10h08
  3. Petit souci avec clause where
    Par ybruant dans le forum SQL
    Réponses: 1
    Dernier message: 21/07/2005, 22h10
  4. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 13h45
  5. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 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