C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

prendre caractere

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
giovanni
Guest





PostPosted: Sat Jan 01, 2005 3:09 pm    Post subject: prendre caractere Reply with quote



ligne dans fichier text.txt
12345 89 45 67
voila comment prendre le chiffre 89 et le mettre dans uen variable 45 etc ?
avec prog dessous
super debutant!
#include <string>
#include <iostream>
#include <fstream>
using namespace std;

int main(int argc, char* argv[])
{
cout << "Veuillez entrer un nom de fichier (sans espace) :n";
string strFileName;
cin >> strFileName;
ifstream file;
file.open(strFileName.c_str());
if (file.is_open())
{
string ligne;

while (getline(file, ligne))
cout << ligne << endl;

{
string strLine;
getline(file, strLine);
cout << strLine << endl;
}
}
else
cout << "Impossible d'ouvrir le fichiern";
return 0;
}






Back to top
Loïc Joly
Guest





PostPosted: Sat Jan 01, 2005 5:54 pm    Post subject: Re: prendre caractere Reply with quote



giovanni wrote:

Quote:
ligne dans fichier text.txt
12345 89 45 67
voila comment prendre le chiffre 89 et le mettre dans uen variable 45 etc ?
avec prog dessous
super debutant!

Je ne suis pas certain de bien comprendre ta question, mais à tout
hasard, regarde du côté de <sstream>.

--
Loïc

Back to top
giovanni
Guest





PostPosted: Sun Jan 02, 2005 11:52 am    Post subject: Re: prendre caractere Reply with quote



au fait je penceun programme qui prend caractere par exemple le 89 et le
compare et ensuite caractere suivant 45 etc
comparer entre 2 prog voir les difference au fait
"Loïc Joly" <loic.actarus.joly (AT) wanadoo (DOT) fr> a écrit dans le message de news:
41d6e3c6$0$17846$8fcfb975 (AT) news (DOT) wanadoo.fr...
Quote:
giovanni wrote:

ligne dans fichier text.txt
12345 89 45 67
voila comment prendre le chiffre 89 et le mettre dans uen variable 45
etc ?
avec prog dessous
super debutant!

Je ne suis pas certain de bien comprendre ta question, mais à tout
hasard, regarde du côté de <sstream>.

--
Loïc



Back to top
drkm
Guest





PostPosted: Sun Jan 02, 2005 4:54 pm    Post subject: Re: prendre caractere Reply with quote

Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:

Quote:
giovanni wrote:

ligne dans fichier text.txt
12345 89 45 67
voila comment prendre le chiffre 89 et le mettre dans uen variable 45 etc ?
avec prog dessous
super debutant!

Je ne suis pas certain de bien comprendre ta question,

Moi non plus.

Quote:
mais à tout
hasard, regarde du côté de <sstream>.

Auquel cas, ceci devrait l'intéresser. Il assume que l'entrée est
une suite de ligne de quatre nombres, séparés par des caractères
blancs. Je suis en fait curieux de voir les commentaires sur ce code.
J'ai toujours l'impression d'oublier des cas particuliers en jouant
avec les flux.

#include <iostream>
#include <istream>
#include <ostream>
#include <sstream>
#include <string>

void display( int line_num , int v1 , int v2 , int v3 , int v4 ) {
std::cout
<< "# " << line_num << ":t"
<< "v1: " << v1
<< ", v2: " << v2
<< ", v3: " << v3
<< ", v4: " << v4
<< std::endl ;
}

void format_error( int line_num ) {
std::cerr << "Error at line " << line_num << "!n" ;
}

bool is_space( std::string const & s ) {
for ( std::string::const_iterator it = s.begin() ,
end = s.end() ;
it != end ;
++ it ) {
char c = * it ;
if ( ! std::isspace( c ) ) {
return false ;
}
}
return true ;
}

bool is_space( std::istringstream & iss ) {
for ( char c = iss.get() ; iss ; c = iss.get() ) {
if ( ! std::isspace( c ) ) {
return false ;
}
}
return true ;
}

int main() {
for ( int line_num = 1 ; std::cin ; ++ line_num ) {
std::string line ;
std::getline( std::cin , line ) ;

if ( is_space( line ) ) {
std::cout << "# " << line_num << ":tempty" << std::endl ;
continue ;
}

int v1 = 0 , v2 = 0 , v3 = 0 , v4 = 0 ;
std::istringstream iss( line ) ;
iss >> v1 >> v2 >> v3 >> v4 ;

if ( iss && is_space( iss ) ) {
display( line_num , v1 , v2 , v3 , v4 ) ;
}
else {
format_error( line_num ) ;
break ;
}
}
}

--drkm

Back to top
drkm
Guest





PostPosted: Sun Jan 02, 2005 5:12 pm    Post subject: Re: prendre caractere Reply with quote

"giovanni" <giovannich (AT) hotmail (DOT) com> writes:

Quote:
au fait je penceun programme qui prend caractere par exemple le 89 et le
compare et ensuite caractere suivant 45 etc
comparer entre 2 prog voir les difference au fait

Je comprends encore moins ...

PS: Peux-tu poster *après* le message cité, stp ?

--drkm

Back to top
giovanni
Guest





PostPosted: Sun Jan 02, 2005 6:22 pm    Post subject: Re: prendre caractere Reply with quote

donc je vais essayer de resumer:
un fichier contient serie de chiffre :
12345 89 45 67 55 22
12345 56 77 34 77 35

un deuxieme fichier contient :
12345 90 89 45 55 44
23344 45 66 76 88 98

voila je veu comparer ces deux fichier mais le debut ne me interesse (12345)
pas ,donc le 89 et le 55 premiere ligne du premier fichier sont dans la
premiere ligne du deuxieme fichier donc me ecris 1= 2 dans variable
ensuite toujours la premiere ligne du premier fichier et comparer a la
deuxieme ligne fu deuxieme fichier et noter dans variable si il y a
similitude de chiffre et ainsi de suite....

au fait je cherche le prog pour verifier fichier 1 et fichier 2 et noter
dans variable difference exmple la premiere ligne
"drkm" <usenet.fclcxx (AT) fgeorges (DOT) org> a écrit dans le message de news:
[email]wksm5j3h76.fsf (AT) fgeorges (DOT) org[/email]...
Quote:
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:

giovanni wrote:

ligne dans fichier text.txt
12345 89 45 67
voila comment prendre le chiffre 89 et le mettre dans uen variable 45
etc ?
avec prog dessous
super debutant!

Je ne suis pas certain de bien comprendre ta question,

Moi non plus.

mais à tout
hasard, regarde du côté de <sstream>.

Auquel cas, ceci devrait l'intéresser. Il assume que l'entrée est
une suite de ligne de quatre nombres, séparés par des caractères
blancs. Je suis en fait curieux de voir les commentaires sur ce code.
J'ai toujours l'impression d'oublier des cas particuliers en jouant
avec les flux.

#include <iostream
#include #include #include #include
void display( int line_num , int v1 , int v2 , int v3 , int v4 ) {
std::cout
"# " << line_num << ":t"
"v1: " << v1
", v2: " << v2
", v3: " << v3
", v4: " << v4
std::endl ;
}

void format_error( int line_num ) {
std::cerr << "Error at line " << line_num << "!n" ;
}

bool is_space( std::string const & s ) {
for ( std::string::const_iterator it = s.begin() ,
end = s.end() ;
it != end ;
++ it ) {
char c = * it ;
if ( ! std::isspace( c ) ) {
return false ;
}
}
return true ;
}

bool is_space( std::istringstream & iss ) {
for ( char c = iss.get() ; iss ; c = iss.get() ) {
if ( ! std::isspace( c ) ) {
return false ;
}
}
return true ;
}

int main() {
for ( int line_num = 1 ; std::cin ; ++ line_num ) {
std::string line ;
std::getline( std::cin , line ) ;

if ( is_space( line ) ) {
std::cout << "# " << line_num << ":tempty" << std::endl ;
continue ;
}

int v1 = 0 , v2 = 0 , v3 = 0 , v4 = 0 ;
std::istringstream iss( line ) ;
iss >> v1 >> v2 >> v3 >> v4 ;

if ( iss && is_space( iss ) ) {
display( line_num , v1 , v2 , v3 , v4 ) ;
}
else {
format_error( line_num ) ;
break ;
}
}
}

--drkm



Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Mon Jan 03, 2005 8:26 am    Post subject: Re: prendre caractere Reply with quote

drkm wrote:
Quote:
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:

giovanni wrote:

ligne dans fichier text.txt
12345 89 45 67
voila comment prendre le chiffre 89 et le mettre dans uen
variable 45 etc ? avec prog dessous super debutant!

Je ne suis pas certain de bien comprendre ta question,

Moi non plus.

Je suis plutôt certain de ne rien avoir compris du tout de ce
qu'il veut faire.

Quote:
hasard, regarde du côté de <sstream>.

Auquel cas, ceci devrait l'intéresser. Il assume que
l'entrée est une suite de ligne de quatre nombres, séparés par
des caractères blancs. Je suis en fait curieux de voir les
commentaires sur ce code.

Surtout, c'est beaucoup trop compliqué. Tu ne profites pas de
toutes les possibilités des istream.

Quote:
J'ai toujours l'impression d'oublier des cas particuliers en
jouant avec les flux.

#include <iostream
#include #include #include #include
void display( int line_num , int v1 , int v2 , int v3 , int v4 )
{
std::cout
"# " << line_num << ":t"
"v1: " << v1
", v2: " << v2
", v3: " << v3
", v4: " << v4
std::endl ;
}

void format_error( int line_num ) {
std::cerr << "Error at line " << line_num << "!n" ;
}

bool is_space( std::string const & s ) {
for ( std::string::const_iterator it = s.begin() ,
end = s.end() ;
it != end ;
++ it ) {
char c = * it ;
if ( ! std::isspace( c ) ) {
return false ;
}
}
return true ;
}

Plusieurs commentaires sur cette fonction :

-- D'abord, elle a un comportement indéfini qui se manifeste
dès qu'il y a un caractère accentué (et potentiellement avec
certains caractères de contrôle ou de ponctuation aussi,
selon l'encodage utilisé). Tu ne peux *PAS* passer un char à
la version de isspace qui ne prend qu'un paramètre -- il
faut le convertir en unsigned char (explicitement).

-- Et aussi, tu n'as pas inclu l'en-tête qui déclare
std::isspace (
-- Et en passant, ton code dépend du locale global de C (qui
n'est pas forcément identique à celui de C++). Il y a
parfois (même souvent) des raisons pour ce faire, lié à
l'état des compilateurs ou de la bibliothèque dont on
dispose, mais dans la mésure où tu sembles chercher une
solution C++ standard, je me démande si c'est ce que tu as
voulu.

La solution C++ utilise évidemment la facette ctype des
locales.

-- Ta fonction s'écrit facilement avec std::find_if. Quand au
prédicat, je dirais que des choses du genre :

class Is
{
public:
Is( std::ctype_base mask,
std::locale const& loc = std::locale::global() )
: myMask( mask )
, myCType(
&std::use_facet< std::ctype< char > >( loc ) )
{
}
bool operator()( char ch ) const
{
return myCType->is( myMask, ch ) ;
}
private:
std::ctype_base::mask myMask ;
std::ctype< char > const* myCType ;
} ;

ainsi que l'équivalent IsNot sont d'une utilité assez
générale pour qu'il se trouve dans toute boîte à outils.

-- Mais en l'occurance, il y a une fonction toute faite pour ce
faire : std::ctype<char>::scan_not. Même si ce n'est pas
particulièrement élégant qu'il faut utiliser s.data() et
s.data()+s.size() à la place des itérateurs.

-- Sinon, dans la passée, je l'ai trouvé souvent intéressant de
construire une fois une chaîne avec toutes les espaces (un
singleton, par exemple), ce qui permet l'utilisation directe
de std::find_first_of ou std::string::find_first_of.

-- Et enfin, il ne faut pas négliger l'existant. Boost::regex,
par exemple, ou GB_CharacterClass chez moi.

Quote:
bool is_space( std::istringstream & iss ) {
for ( char c = iss.get() ; iss ; c = iss.get() ) {
if ( ! std::isspace( c ) ) {
return false ;
}
}
return true ;
}

En quoi est-ce que cette fonction diffère de :

iss >> std::ws && iss.peek() == EOF

? (À part une fois de plus que ta version a un comportement
indéfini qui est absent dans la version plus simple.)

Quote:
int main() {
for ( int line_num = 1 ; std::cin ; ++ line_num ) {
std::string line ;
std::getline( std::cin , line ) ;
if ( is_space( line ) ) {
std::cout << "# " << line_num << ":tempty" << std::endl ;
continue ;
}
int v1 = 0 , v2 = 0 , v3 = 0 , v4 = 0 ;
std::istringstream iss( line ) ;
iss >> v1 >> v2 >> v3 >> v4 ;

if ( iss && is_space( iss ) ) {
display( line_num , v1 , v2 , v3 , v4 ) ;
}
else {
format_error( line_num ) ;
break ;
}
}
}

int
main()
{
int lineNumber = 0 ;
std::string line ;
while ( std::getline( std::cin, line ) ) {
++ lineNumber ;
std::istringstream iss( line ) ;
iss >> std::ws ;
int v1, v2, v3, v4 ;
if ( iss.peek() == EOF ) {
std::cout << "# " << line_num << ":tempty" <<
std::endl ;
} else if ( iss >> v1 >> v2 >> v3 >> v4 >> std::ws
&& iss.peek() == EOF ) {
display( lineNumber, v1, v2, v3, v4 ) ;
} else
formatError( lineNumber ) ;
}
}
return 0 ;
}

On pourrait éventuellement préférer une solution qui utilise
boost::regex (voire GB_RegularExpression -- exceptionnellement
plus facile dans ce cas-ci) pour valider le format de la ligne
avant de le mettre dans l'istringstream pour la conversion.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Back to top
drkm
Guest





PostPosted: Mon Jan 03, 2005 4:33 pm    Post subject: Re: prendre caractere Reply with quote

[email]kanze (AT) gabi-soft (DOT) fr[/email] writes:

Quote:
drkm wrote:

Je suis en fait curieux de voir les
commentaires sur ce code.

Surtout, c'est beaucoup trop compliqué. Tu ne profites pas de
toutes les possibilités des istream.

Ok. Merci pour ces explications. Je n'en attendais pas moins de
toi Wink. J'espère vivement enfin trouver le temps de lire le bouquin
de Langer et Kreft.

--drkm

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.