Rechercher : dans
Par :

équivalent scanf en c++

Dernière réponse le 31 mar 2008 à 20:52:54 -, le 30 mar 2008 à 19:33:09 
 Signaler ce message aux modérateurs

Bonjour,
Y-a-t-il un équivalent c++ de la fonction scanf ?
Le but est de récupérer des nombres dans un string formaté, pour l'instant j'utilise :

scanf(txt.c_str(), "truc %ld bidule %ld machin", &m, &n);

mais ça fait pas vraiment gueule c++, en plus ça marche pas à tout les coups...
Configuration: Windows Vista
Firefox 2.0.0.13

Meilleures réponses pour « équivalent scanf en c++ » dans :
Equivalent de Partition Magic (gratuit) VoirIl existe aujourd'hui plusieurs logiciels gratuits/libres pour partitionner qui équivalent le logiciel payant Partition Magic et constituent une excellente alternative. Voici une sélection des meilleurs logiciels de partitionnement gratuits ou...
Equivalent de Nero (gratuit) VoirIl existe aujourd'hui plusieurs logiciels gratuits/libres pour graver qui équivalent le logiciel payant Nero. Voici une sélection des meilleurs logiciels de gravure gratuits ou libres : Burnatonce : http://burnatonce.com/ BurnCDCC :...
Equivalent de Microsoft Office (gratuit) VoirIl existe aujourd'hui des suites bureautiques gratuites et libres qui équivalent la suite Microsoft Office onéreuse. Pour rappel, une suite bureautique propose généralement les éléments suivants : traitement de texte, tableur, présentation...
Télécharger Visual C++ Express VoirVisual C++ Express est une version "gratuite" et allégée de Visual Studio ; l'utilisation requiert l'inscription sur le site de Microsoft. Cet environnement de développement permet de créer des application Win32 ou du .NET C.
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...

1

Le D, le 30 mar 2008 à 23:31:19

Scanf étant une fonction native du C, elle se retrouve en C++

/* scanf example */
#include <stdio.h>

int main ()
{
char str [80];
int i;

printf ("Entrez votre nom de famille: ");
scanf ("%s",str);
printf ("Entrez votre nom: ");
scanf ("%d",&i);
printf ("Mr. %s , %d ans.\n",str,i);
printf ("Entrez un nombre en héxa: ");
scanf ("%x",&i);
printf ("Vous avez entré %#x (%d).\n",i,i);

return 0;
}


A+

Répondre à Le D

2

Le D, le 30 mar 2008 à 23:33:47

J'ai fait une faute :

printf ("Entrez votre age: "); à la place de printf ("Entrez votre nom: ");

Répondre à Le D

3

kilian, le 31 mar 2008 à 01:42:29

En C++ on utilise plutôt le flux "cin".
http://www.siteduzero.com/...

Répondre à kilian

4

-, le 31 mar 2008 à 18:22:19

Oui sauf que "cin" sert à récupérer des données depuis le clavier, or j'ai une chaine déjà toute faite et je veux récupérer des nombres dans cette chaine.
Et scanf ça marche très bien sauf que ça marche pas !! (^^)... En fait ça marche, mais mal, ça bug parfois...
Et puis j'utilise un string, pas une chaine de caractère, donc c'est pas tout à fait adapté.
J'osais penser que la magie de la POO aurait fait une fonction toute faite qui marche pour faire ça...

Répondre à -

5

-, le 31 mar 2008 à 18:27:39

Aaahhhhhhh !!!!!!!!
Je viens de trouver ma connerie : c'est l'équivalent de "fscanf" que je veux, pas scanf...
Scusez...

Répondre à -

6

kilian, le 31 mar 2008 à 18:32:01

C'est la même chose avec un fichier. C'est juste qu'il te faut un objet de type ifstream.

Répondre à kilian

7

-, le 31 mar 2008 à 18:32:21

À ben non !!! Décidemment je l'aime pas cette fonction... C'est bien scanf...
Re-scusez...

^^

Répondre à -

8

kilian, le 31 mar 2008 à 18:35:04

Tu l'aimes pas parce que tu l'as pas encore essayée ;-)

Répondre à kilian

9

-, le 31 mar 2008 à 18:40:23

Si !!
...
(mais je l'aime pas quand m^me !!!)
...
Sinon pour un équivalent avec un string plutôt qu'un char* ??

Répondre à -

10

kilian, le 31 mar 2008 à 18:42:47

Justement utiliser un objet de type ifstream avec l'opérateur >>
C'est prévu pour des string.

Répondre à kilian

11

-, le 31 mar 2008 à 18:45:23

Heuuuu... ouép !!
Un pitit exemple serait trop te demander ??

S'il te plait... ais pitié de moi...

^^

Répondre à -

12

kilian, le 31 mar 2008 à 18:48:46

Jure moi l'allégeance, et je te file un exemple.

Répondre à kilian

13

-, le 31 mar 2008 à 18:51:36

Tous ça pour un petit exemple ??

Bon allez... je le jure !!!

^^

Répondre à -

14

kilian, le 31 mar 2008 à 19:00:28

J'accepte!

Prenons un fichier nommé test.cpp
On va y mettre ce code (je mets des commentaires pour expliquer):

#include <fstream> //En-têtes pour la classe ifstream
#include <iostream> //En têtes pour utiliser cout

/*Permet de ne pas s'embarasser avec les préfixes de nom (exemple std::cout devient cout) */
using namespace std; 

int main()
{
	string s; //la chaine
	ifstream ifs("test.cpp"); //On ouvre le fichier source (le fichier dans lequel on est)
	ifs >> s; //On met la première ligne du fichier dans la chaine s
	cout << s; //On affiche la chaine
	return 0;
}

Répondre à kilian

15

kilian, le 31 mar 2008 à 19:04:30

Toutes les références pour la classe ifstream sont là:
http://www.cplusplus.com/reference/iostream/ifstream/

Répondre à kilian

16

Mahmah, le 31 mar 2008 à 19:14:12

Salutations,

On va faire bref et violent:

binary '>>' : no operator found which takes a right-hand operand of type 'std::string' (or there is no acceptable conversion)


M.

Répondre à Mahmah

17

-, le 31 mar 2008 à 19:20:54

Heu...
moi j'ai un truc du genre :

#include <iostream>
using namespace std;

int main()
{
	/*tout plein de code*/

	string txt = "truc 12 bidule 321 machin";
...

mon but c'est de récupérer 12 et 321, pour l'instant j'utilise :
	double m;
	double n;
	scanf(txt.c_str(), "truc %ld bidule %ld machin", &m, &n);

En fait j'espérais qu'une fonction existait pour manipuler directement le string (et sans merder, parce que scanf à des défauts qui sont un peu chiant dans le programme).

Soyons fou, je voudrais un truc du genre (enfin... à peut près hein !! là j'invente pour dire d'illustrer !! ^^) :
txt.nom_de-la_fonction("truc ", &m, " bidule ", &n, "machin");

heu... oué, j'suis pas sûr de moi là, on va en faire un autre (juste pour le fun !! ^^) :
txt >> "truc " >> m >> " didule " >> n >> " machin"; //ça serait vraiment simple là, mais on peut toujours rêver...

Répondre à -

18

-, le 31 mar 2008 à 19:22:52

J'ai beau me relire, je trouve la roue que je viens de réinventer de plus en plus bancale...

^^

Répondre à -

19

kilian, le 31 mar 2008 à 19:28:20

Ben non par contre c'est plus compliqué. Si tu veux utiliser les formatages, là je vois pas.

Répondre à kilian

20

-, le 31 mar 2008 à 19:35:20

Bon tant pis...

Merci quand m^me !!
J'aurais quand même bien ri !! (l'allégeance je m'y attendais pas...)

Répondre à -

21

kilian, le 31 mar 2008 à 19:41:38

Non mais oh! J'ai pas dit que c'était fini!

Non j'ai oublié de dire qu'en fait les fonctions de type scanf sont connues pour être dangeureuses. J'ai envie de dire que ce sont des fonctions qui servent à apprendre le C.
Si tu es sûr que ton fichier est organisé de telle ou telle manière, il vaut peut être mieux y aller avec des fonctions comme >> ou read()...

Répondre à kilian

22

 Mahmah, le 31 mar 2008 à 20:52:54

Personnellement je préfère scanf mais bon...

#include <conio.h>

#include <iostream>
#include <fstream>
#include <string>

#include <sstream>

int main( int argc, char *argv[])
{
	std::string		dummy;
	long double		ldValue1;
	long double		ldValue2;
	std::stringstream	ss;

	std::ifstream		file( "test.txt" );

	if ( file.is_open() )
	{
		ss << file.rdbuf();	// <- /!\ ici ça bourrine /!\

		while ( ss >> dummy >> ldValue1 >> dummy >> ldValue2 >> dummy )
			std::cout	<< "Value1 = " << ldValue1 << "\t"
				 	<< "Value2 = " << ldValue2 << std::endl;

		file.close();
	}

	getch();

	return 0;
}


Ce serait plus propre de le faire avec des ::std::getline à moins que le fichier ne soit pas trop gros.

M.

Répondre à Mahmah