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.
Version imprimable
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...)
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...
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.Citation:
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 ?
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 deCode:
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:
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:
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;