Textfile einlesen und brackets auslassen
-
Hallo,
ich will ein txt-File einlesen. Es steht z. B. (mit Leerzeichen getrennt)
A [832]
c [32]
d [24]
.
.Die character (ch) werden eingelesen und die Zahlen sollten das auch, nur machen mir die brackets noch Probleme.
while (in && !in.eof() && in>>ch>>cost) { s.insert(std::pair<int, Node*>(cost, new Node(cost, ch)));Ich könnte die brackets mit Zahlen als string einlesen und mit ner for-Schleife manuell entfernen lassen. Ich habe in der c++ Std.bib die Funktion basic_string& erase(size_type pos = 0, size_type n = npos);
gefunden, die dann 2mal auferufen würde. Hat jmd. eine andere Lösung?Gruß
Thomas
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
char dummy; /* ... */ in >> ch >> dummy >> cost >> dummy /* ... */Müsste doch gehen?
-
oder so:
#include <iostream> #include <fstream> #include <map> struct Node { int cost_; char ch_; }; std::istream& operator>>( std::istream& in, Node& nd ) { // Format: ch [ cost ] char lbracket, rbracket; if( in >> nd.ch_ >> lbracket >> nd.cost_ >> rbracket && (lbracket != '[' || rbracket != ']') ) in.setstate( std::ios_base::failbit ); return in; } int main() { using namespace std; map< int, Node* > s; ifstream in("input.txt"); for( Node nd; in >> nd; ) { s.insert( std::pair<int, Node*>( nd.cost_, new Node(nd) ) ); } return 0; }
-
Irgendwie finde ich es höchst unheimlich, in einer nicht-multi-map rohe Zeiger auf dynamische Objekte zu speichern. Das schreit geradezu nach Speicherlöchern. Mir schwant, der Threadersteller möchte gar kein new, weiß nur nicht, dass es ohne viel besser geht.
-
Danke erstmal für die schnellen Antworten.
Irgendwie finde ich es höchst unheimlich, in einer nicht-multi-map rohe Zeiger auf dynamische Objekte zu speichern. Das schreit geradezu nach Speicherlöchern. Mir schwant, der Threadersteller möchte gar kein new, weiß nur nicht, dass es ohne viel besser geht.
std::multimap<int, Node*> s;1. Warum eine nicht multi-map?
2. Leider habe ich noch nicht viel mit Smart Pointern gearbeitet. Danke für den Anstoß!
-
tommy8142 schrieb:
1. Warum eine nicht multi-map?
weil bei einer Datei wie dieser
A [832] c [32] d [24] e [832]in der zweimal der gleiche Schlüssel [832] auftaucht, der erste Eintrag - und damit der Node* - durch den zweiten überschrieben wird, wenn Du eine map verwendest. D.h. Du bekommst sofort ein MemoryLeak.
Was spricht gegen std::map< int, Node >?
-
Also wenn ich "C++ lernen und professionell anwenden" richtig verstehe
Multimap: Es kann mehrere Objekte mit demselben Schlüssel geben.
dann kommt eine map nicht infrage, weil diese mir dann die Schlüssel überschreibt.
Class node besteht aus:class Node{ unsigned int _cost; char _ch; Node *_nLeft, *_nRight; public: .... };Ich verstehe also nicht warum eine map nicht in Frage kommt?
-
tommy8142 schrieb:
dann kommt eine map nicht infrage, weil diese mir dann die Schlüssel überschreibt.
Nein, eine map überschreibt nichts. Du überschreibst einen ggf. vorhandenen Wert, wenn du über den operator[] schreibend darauf zugreifst. Ein insert() schlägt einfach fehl, d.h. es macht nichts (und liefert ggf. ein false), wenn ein entsprechender Key schon vorhanden ist. (Wenn du daraus keine Konsequenzen ziehst und einfach davon ausgehst, dass du das übergebene Element in der map gesichert hast, kriegst du in dem Fall natürlich trotzdem Speicherlecks)
-
Verwend z.B. std::unique_ptr statt roher Zeiger und plötzlich keine Speicherlöcher mehr...