Bonjour, je voulais savoir comment on fesait pour connaitre la taille d un fichier sur entrée standard ?
Et comment récupere tout les texte contenu dedans ?
MErci.
Bonjour, je voulais savoir comment on fesait pour connaitre la taille d un fichier sur entrée standard ?
Et comment récupere tout les texte contenu dedans ?
MErci.
je crains que tu ne puisses, et que tu sois obligé de tout lire au fur et à mesure... (à coup de fgets() et d'une liste chaînée par exemple...)
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Pour savoir la taille à partir d'un flux : demande à aller à la fin puis demande quelle est ta position.
Pour savoir la taille à partir d'un nom de fichier : utilise boost.filesystem.
Mais comment connaitre le nombre de ligne d un fichier en entrée standard ?
Il faut tout lire et compter au fur et à mesure.
Je suis totalement debutant... Comment fait ton pour tout lire ?
Je dois boucler sur un fichier qui na pas de taille précise et lire plusieurs info par ligne pour les comparer.
Et je ne sais pas comment dire a ma boucle de boucler jusqua la fin du fichier...
Merci
On ne peut connaître à l'avance la "taille" de l'entrée standard, car on ne peut pas revenir au début une fois arrivé au bout.
Tu es donc obligé de tout lire au fur et à mesure (ligne par ligne, par exemple...).
En C++, tu peux utiliser std::getline() (fonction déclarée (et définie, puisque c'est un template) dans <string>) qui te soulage du fardeau de devoir agrandir toi-même ton buffer si la ligne est trop grande.
std::getline() te donne à chaque fois une std::string contenant une ligne entière, il te restera donc à ajouter ces std::string à un conteneur de la STL...
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
J'ai deux valeure par ligne, séparer par un espace, je voudrait comparer a chaque fois les infos que je trouve sur lentrée standard
Voici mon code... Sa ne fonctionne pas !
#include <iostream>
#include <string>
int main(void){
std::string adresse;
std::string num;
while(std::getline()){
//ici j aimerai affecter la premier valeure a une variable(adresse) et la seconde valeure a l autre variable(num)
}
return 0;
}
Si vous pouviez m indiquer comment récuperer les 2 valeures par ligne sa serai sympa
Merci
Normal, tu t'es pas documenté sur std::getline pour savoir comment l'utiliser correctement.Sa ne fonctionne pas !
Ce n'est pas possible. Tu dois tout lire et après analyser une fois que l'entrée standard aura été fermée.
Et pourquoi tu veux connaitre cette taille ?
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
Salut,
La fonction getline() (disponible dans l'espace de nommage std) prend, au minimum, deux parametres:
Le flux d'entrée à utiliser et
Une chaine pour récupérer ce qui est lu.
Un troisième parametre, facultatif permet de déterminer un délimiteur (caractère représentant la fin de lecture). Par défaut, c'est le retour à la ligne.
Tu disposes de trois sortes de flux d'entrée:
-L'introduction "clavier" par l'utilisateur
-les fichiers ouvert en lecture (typiquement std::ifstream)
-les chaines de flux d'entrée (std::istringstream)
Si tu veux lire toute une ligne dans un fichier, tu peux travailler sous la forme de
Si tu veux récupérer une introduction clavier, cela prendra la forme de
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 //déclaration d'un chaine pour récupérer la lecture std::string recup //ouverture du fichier std::ifstream fichier("nom_du_fichier.ext") //n'oublions pas de tester l'ouverture if(!(fichier.is_open()) { std::getline(fichier,recup); //gestion de la ligne récupérée (qui sera "koala,nounours", par exemple) } else { //oupppsss, fichier non ouvert }
Enfin, les istringstream utilisées avec getline viennent à ton secours pour séparer une chaine en fonction d'un séparateur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 //déclaration de la chaine qui permet d'avoir l'introduction clavier std::string recup; std::getline(std::cin,recup); //gestion de la chaine récupérée
NOTA: pour pouvoir utiliser les ifstream/ofstream et les istringstream/ostringstream, il faut inclure respectivement les entetes <fstream> et <sstream>
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 //recup est une std::string du genre de "koala01,nounours" //il nous faut 2 chaines distrincte s (une pour koala01 et une pour nounours) std::string chaine1; std::string chaine2; //création de la chaine d'entrée std::istringstream iss(recup); //récupération de la première chaine dans chaine1 std::getline(iss,chaine1,','); //récupération de la deuxieme chaine dans chaine2 std::getline(iss,chaine2) //////////////////////////////////////////////////////////////// //utilisation dans le cadre d'une chaine dont on ignorerait le nombre d'éléments // du genre de "koala,nounours,australie,bush,...." //une chaine qui nous servira plusieurs fois std::string chaine; //un vecteur de chaines std::vector<std::string> separees; //et bien sur l'istringstream std::istringstream iss(recup); while(std::getline(iss,chaine,',')) { //insertion de la chaine récupérée à la fin du vecteur de chaines separees.push_back(chaine); } //un affichage de vérification for(unsigned int i=0;i<separees.lengt();i++) std::cout<<separees[i]<<std::endl;
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
Partager