datei öffnen und zeile nach zeile analysieren
-
Hallo Leute,
ich versuche ein Programm in c++ zu schreiben, ich möchte eine Assemblerdatei öffnen und Zeile nach Zeile interpretieren! ich bin totale Anfänger bei c++ Programmierung. Ich hoffe, dass jemand mir weiterhilft.......
ich möchte ein Datei öffnen und erste Zeile lesen und analysieren. der Datei ist so aufgebaut(z.B, ein Teil davon):
ld %r1
ld %r2
addx %r3,%r1,%r2in Datei vor und nach der Befehle ist durch Tab getrennt. ich möchte z.B ld als Befehl und %r1 als Register erkannt werden und in einem Array oder Vector speichern. :(v
Vielen Dank und liebe Grüße
-
Was ist deine Frage?
Wenn dir jemand das Programm schreiben soll, ist es wohl eher was fürs Projekteforum.
-
ich habe schon der Datei geöffnet und Zeile nach Zeile gelesen...
aber ich weiß nicht, wie ich die Zeile analysieren und speichern. Sei bitte nicht zu Streng mit mir!
-
rana2007 schrieb:
ich habe schon der Datei geöffnet und Zeile nach Zeile gelesen...
aber ich weiß nicht, wie ich die Zeile analysieren und speichern. Sei bitte nicht zu Streng mit mir!Definiere "analysieren". Was willst Du erreichen? Und was willst Du speichern?
-
rana2007 schrieb:
ich habe schon der Datei geöffnet und Zeile nach Zeile gelesen...
aber ich weiß nicht, wie ich die Zeile analysieren und speichern. Sei bitte nicht zu Streng mit mir!Es ist IMHO schlechter Stil 'Zeilen' aus einer Datei zu lesen und erst danach(!) sich darüber Gedanken zu machen, wie man den Inhalt der 'Strings' interpretiert. Suche mit Google nach "site:c-plusplus.net getline ist doof", dann weißt Du was ich meine
Eleganter ist es, dies unmittelbar während das Lesens zu tun.Du machst uns das Antworten einfacher, wenn Du uns mitteilst, wie die Datenstrukturen aussehen, in die die interpretierte(!) Information letztlich landen soll.
Ich unterstelle mal eine Struktur wie:
struct Param { int regNo; // Nr. des Registers // .. u.a. }; struct Command { // oder class int token; // oder enum std::vector< Param > params; }
Ist es richtig, dass jedes Register in der Datei mit ',' oder Linefeed oder Tabulator beendet wird?
Oder besser - steht für jeden Kommandotyp die Anzahl der Parameter fest - also 'addx' =3 und 'ld' =1?Gruß
WernerPS.: melde mich ggf. erst heute abend wieder
@Edit 2.Frage hinzu gefügt
-
ich möchte einen Datei öffnen. Datei ist im Assembler Sprache. Es soll Zeile nach Zeile gelesen werden um die Befehle und Register in jeder Zeile erkennt zu werden. Danach jede Zeile als Element in Array speichern. Im nächste Schritt werde ich die Elemente nach Datenabhängigkeit sortieren.
im Datei gibt es immer ein Tabulator vor und nach der Befehl. Zwischen zwei Register ist immer ein Komma(,). Anstatt der Register kann auch Zahlen Vorkommen.
-
Du willst also einen Parser schreiben. Das kannst Du entweder mit Tools machen (z.B. Boost.Spirit) oder händisch schreiben.
Ganz einfach kannst Du natürlich auch mit getline eine Zeile lesen und eine regex darauf prügeln. Auch wenn Werner Salomon sagt, dass das doof ist (und ich stimme da sogar zu), ist das einfach und (leider) gängige Praxis, weil leider viel zu wenige Entwickler wissen, was ein Parser ist.
Aber erst mal würde ich damit anfangen, eine Datenstruktur zu implementieren, welches die Daten aufnehmen kann.
-
@Werner: Die Google-Suchfunktion ginge auch. Ist nämlich repariert, dank Dravere.
-
Hallo rana2007,
ich habe jetzt erst Dein letztes Posting gelesen und kann verstehen, dass Du etwas gefrustet bist.
Du schreibst, dass Du Anfänger bist, also ist es ganz natürlich, dass Du Schwierigkeiten hast, die 'richtigen' Fragen zu stellen.
Folglich bekommst Du auch keine richtigen Antwortenrana2007 schrieb:
ich möchte einen Datei öffnen.
Ok - das kannst Du wohl schon ...
rana2007 schrieb:
ich habe schon der Datei geöffnet und Zeile nach Zeile gelesen...
rana2007 schrieb:
Datei ist im Assembler Sprache.
Das ist kein Problem, Hauptsache es ist in einem lesbaren Format.
rana2007 schrieb:
Es soll Zeile nach Zeile gelesen werden um die Befehle und Register in jeder Zeile erkennt zu werden.
.. beim 'Erkennen' der Befehle und Register wird es jetzt schwierig. Das setzt voraus, dass Du schon eine Idee hast, was damit passieren soll ...
rana2007 schrieb:
Danach jede Zeile als Element in Array speichern.
Das ist jetzt kein Problem - nehme einfach einen std::vector<>, aber ...
rana2007 schrieb:
Im nächste Schritt werde ich die Elemente nach Datenabhängigkeit sortieren.
das wissen wir natürlich nicht, was Du damit meinst. Und genau davon ist es abhängig, wie so eine Datenstruktur eigentlich aussehe soll.
rana2007 schrieb:
im Datei gibt es immer ein Tabulator vor und nach der Befehl. Zwischen zwei Register ist immer ein Komma(,). Anstatt der Register kann auch Zahlen Vorkommen.
das sollte einfach zu machen sein.
Und damit es mal voran geht, mache ich mal einen (hoffentlich für Dich einfach nach zu vollziehenden) Vorschlag.
Folgendes Programm liest so eine Datei ein, speichert die 'Kommandos'- also Befehle und Parameter - in einerstruct Kommando
ab und sagt am Ende, wie viele gelesen wurden.#include <fstream> #include <iostream> #include <string> #include <vector> struct Kommando { std::string befehl; std::string parameter; // das muss sicher noch überarbeitet werden }; // diese Funktion liest ein Kommando-Objekt ein std::istream& operator>>( std::istream& in, Kommando& k ) { return getline( in >> k.befehl >> std::ws, k.parameter ); } int main() { using namespace std; std::vector< Kommando > kommandos; ifstream datei("eineDatei.asm"); // hier den Namen Deiner Assembler-Datei eintragen if( !datei.is_open() ) { // prüfe immer, ob das Oeffenn gut gegangen ist cerr << "Fehler beim Oeffnen der Datei" << endl; return 0; } for( Kommando k; datei >> k; ) kommandos.push_back( k ); cout << kommandos.size() << " Eintraege gelesen" << endl; /// sort( begin(kommandos), end(kommandos), ??? ); // Elemente nach Datenabhängigkeit sortieren return 0; }
Probiere das einfach mal aus und versuche folgende Fragen zu beantworten:
Werner Salomon schrieb:
steht für jeden Kommandotyp die Anzahl der Parameter fest - also 'addx' =3 und 'ld' =1?
Was bedeutet: 'nach Datenabhängigkeit sortieren'? nach welchem Kriterium soll ein Kommando in einer sortierten Liste vor einem anderen Kommando stehen?
Gruß
Werner
-
Arcoth schrieb:
@Werner: Die Google-Suchfunktion ginge auch. Ist nämlich repariert, dank Dravere.
Ähm ... suche ich nach 'getline ist doof' kommt als Resultat:
C++ Forum schrieb:
Keine Beiträge entsprechen Ihren Kriterien.
und suche ich statt dessen nach 'getline' kommt auch:
C++ Forum schrieb:
Keine Beiträge entsprechen Ihren Kriterien.
Ich bin wirklich dankbar, dass es Leute gibt, die dieses Forum am Leben halten, aber hier besteht Verbesserungspotential
- oder der Hinweis auf Google - geht ja auch und macht weniger Arbeit, oder?
Gruß
Werner
-
Werner Salomon schrieb:
Arcoth schrieb:
@Werner: Die Google-Suchfunktion ginge auch. Ist nämlich repariert, dank Dravere.
Ähm ... suche ich nach 'getline ist doof' kommt als Resultat:
C++ Forum schrieb:
Keine Beiträge entsprechen Ihren Kriterien.
und suche ich statt dessen nach 'getline' kommt auch:
C++ Forum schrieb:
Keine Beiträge entsprechen Ihren Kriterien.
Ich bin wirklich dankbar, dass es Leute gibt, die dieses Forum am Leben halten, aber hier besteht Verbesserungspotential
- oder der Hinweis auf Google - geht ja auch und macht weniger Arbeit, oder?
Es gibt da zwei Suchfelder, die klassische Forensuche (unten, nicht funktionierend) und eine Googlesuche auf dem Forum (oben), die funktioniert. Ist genau wie Google selbst zu nutzen, aber man spart sich eben das
site:...
Habe ich heute übrigens auch das erste Mal bemerkt
-
SeppJ schrieb:
Es gibt da zwei Suchfelder, die klassische Forensuche (unten, nicht funktionierend) und eine Googlesuche auf dem Forum (oben), die funktioniert.
Danke für den Hinweis - so geht's
-
// diese Funktion liest ein Kommando-Objekt ein std::istream& operator>>( std::istream& in, Kommando& k ) { return getline( in >> k.befehl >> std::ws, k.parameter ); }
Das kapier ich jetzt nicht wirklich. Also bin jetzt auch nicht der Oberguru mit Operator überladung, aber welche Signatur von getline greift denn da ?
getline hat doch "istream& getline (istream& is, string& str)" , wie funktioniert das da mit (in >> k.befehl...) ??
-
hu?? schrieb:
// diese Funktion liest ein Kommando-Objekt ein std::istream& operator>>( std::istream& in, Kommando& k ) { return getline( in >> k.befehl >> std::ws, k.parameter ); }
Das kapier ich jetzt nicht wirklich. Also bin jetzt auch nicht der Oberguru mit Operator überladung, aber welche Signatur von getline greift denn da ?
getline hat doch "istream& getline (istream& is, string& str)" , wie funktioniert das da mit (in >> k.befehl...) ??Schau mal auf den Rückgabewert von operator>>.
-
Ah.... verschachtelt verschachtelt...
-
C Newbie schrieb:
hu?? schrieb:
// diese Funktion liest ein Kommando-Objekt ein std::istream& operator>>( std::istream& in, Kommando& k ) { return getline( in >> k.befehl >> std::ws, k.parameter ); }
Das kapier ich jetzt nicht wirklich. Also bin jetzt auch nicht der Oberguru mit Operator überladung, aber welche Signatur von getline greift denn da ?
getline hat doch "istream& getline (istream& is, string& str)" , wie funktioniert das da mit (in >> k.befehl...) ??Schau mal auf den Rückgabewert von operator>>.
Und welchen Vorteil bietet das, das so zu schreiben, dass man das kaum versteht? Man muss es doch nicht so kryptisch schreiben, auch wenn man das kann.
-
-
Hallo Werner,
Vielen Dank für dein Tipp. Ich kann jetzt weiter programmierenkommst du immer im Froum?
Gruß,
Rana