std::stringstream de lire les int et les chaînes de caractères, à partir d'une chaîne
Je suis à la programmation en C++ et je ne suis pas sûr de la façon d'atteindre les objectifs suivants:
Je copie un fichier de flux de la mémoire (parce que j'ai été invité à, je préfère la lecture de flux), et puis essayer d'accéder à ses valeurs à enregistrer dans les chaînes et les variables int.
C'est de créer un interprète. Le code je vais essayer de l'interpréter, c'est (ie):
10 PRINT A
20 GOTO 10
C'est juste un petit exemple de code. Maintenant, les valeurs seront stockées dans une "carte" de la structure au premier et accéder plus tard quand tout sera "interprété".
Le stockage de valeurs sont:
int lnum //numéro de la ligne
string cmd //commande (à IMPRIMER et GOTO)
chaîne exp //expression (A et 10 dans ce cas, mais pourrait tenir des expressions comme (a*b)-c )
question est donné le code suivant, comment puis-je accéder à ces valeurs et de les stocker dans la mémoire?
Aussi l'exp de la chaîne est de taille variable (peut-être juste une variable ou une expression), donc je ne suis pas sûr de la façon de les lire et de les stocker dans la chaîne.
code:
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <cstring>
#include <map>
#include <sstream>
using namespace std;
#include "main.hh"
int main ()
{
int lenght;
char *buffer;
//get file directory
string dir;
cout << "Please drag and drop here the file to interpret: ";
getline (cin,dir);
cout << "Thank you.\n";
cout << "Please wait while your file is being interpreted.\n \n";
//Open File
ifstream p_prog;
p_prog.open (dir.c_str());
//Get file size
p_prog.seekg (0, ios::end);
lenght = p_prog.tellg();
p_prog.seekg(0, ios::beg);
//Create buffer and copy stream to it
buffer = new char[lenght];
p_prog.read (buffer,lenght);
p_prog.close();
//Define map<int, char>
map<int, string> program;
map<int, string>::iterator iter;
/***** Read File *****/
int lnum; //line number
string cmd; //store command (goto, let, etc...)
string exp; //to be subst with expr. type inst.
// this is what I had in mind but not sure how to use it properly
// std::stringstream buffer;
// buffer >> lnum >> cmd >> exp;
program [lnum] = cmd; //store values in map
//free memory from buffer, out of scope
delete[] buffer;
return 0;
}
J'espère que c'est clair.
Merci pour votre aide.
Valerio
OriginalL'auteur Val | 2009-12-10
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un
std::stringstream
de tirer des jetons, en supposant que vous connaissez déjà le type.Pour un interprète, je recommande fortement l'aide d'un analyseur plutôt que d'écrire votre propre. Du coup de pouce XPressive bibliothèque ou ANTLR fonctionne très bien. Vous pouvez construire votre interprète à l'aide de primitives sémantiques d'actions que vous analyser la grammaire ou tout simplement construire un AST.
Une autre option serait Flex & Bison. Fondamentalement, ce sont tous les outils pour l'analyse pré-défini les grammaires. Vous pouvez construire votre propre, mais de se préparer pour la frustration. De manière récursive l'équilibrage de parenthèses ou de l'application de l'ordre des opérations (fracture avant de multiplier, par exemple) n'est pas trivial.
Le raw C++ analyse de la méthode suivante:
OriginalL'auteur pestilence669
La façon dont quelque chose comme cela peut être fait (en particulier de l'expression arithmétique de la partie que vous avez fait allusion à l') est:
5
ou+
serait un jeton. Vous pouvez analyser le texte de ces, ou de séparateurs tels que les espaces.Puis, sur la base de cette grammaire, on peut écrire quelque chose qui analyse les jetons des expressions dans les arbres.
Alors vous pourriez avoir un arbre qui ressemble à ça (pardon de l'ASCII art)
Où cela représente l'expression 5 + (x * 3). En ayant cette dans une structure en arbre, il est vraiment facile d'évaluer des expressions dans votre code: vous pouvez récursive descendre de l'arbre, d'effectuer les opérations avec les nœuds enfants comme arguments.
Voir la suite des articles de Wikipédia:
Ou consultez votre représentant local du département d'informatique. 🙂
Il existe également des outils qui génèrent ces analyseurs pour vous sur la base d'une grammaire. Vous pouvez faire une recherche pour "analyseur générateur".
OriginalL'auteur asveikau
Ne pas faire de l'allocation dynamique de la mémoire tampon d'utiliser explicitement un vecteur.
Cela rend la gestion de la mémoire implicite.
Personnellement, je n'ai pas explicitement l'utilisation close() (sauf si je veux attraper une exception). Il suffit d'ouvrir un fichier dans un champ qui va provoquer le destructeur de fermer le fichier quand elle est hors de portée.
buffer(lenght]);
<-- Vous avez un supplément de]
cacher là-bas 🙂OriginalL'auteur Martin York
Cela peut être de l'aide:
http://oopweb.com/CPP/Documents/CPPHOWTO/Volume/C++Programming-HOWTO-7.html
En particulier à la section 7.3.
Vous pourriez être mieux de juste << " ing les lignes, plutôt que de la recherche et de charbuffer route.
OriginalL'auteur Stu