hackrboy146 Geschrieben 16. November 2008 Geschrieben 16. November 2008 Hallo, ich möchte eine Textdatei zeilenweise einlesen und jede Zeile überprüfen ob sie leer ist oda nicht, wenn nicht möchte ich den Wert in einer Variable abfangen. Mein erster Ansatz: array<String^>^ lines = File::ReadAllLines("benutzer.txt"); for each(String line in lines) { if (line != "") { ... = line; } doch es funktioniert nur für die erste Zeile!! Brauche dringend Hilfe!! Mfg Patrick Zitieren
AndiE Geschrieben 16. November 2008 Geschrieben 16. November 2008 Hallo, die Notation sagt mir nichts. Ich würde die Datei Buchstabenweise einlesen und jedes Zeilenende, also entweder 0x0D (Zeilenschaltung) oder eine gesamte Zeichenanzahl von 80 Zeichen als neue Zeile interpretieren. Im Prinzip sollte das so gehen (VC++ 6) CArchive ar; / Archivierungsklasse char c; int zz; / Zeichenzähler int z[100] / Feld für Zeilenlängen int i; / Laufvariable i=0; while (c=Read(ar,1)!=EOF) / Ein Zeichen auslesen- Datei ist nicht zu Ende { if ( c!= 0x0D) { zz=zz+1; / Zeichen an aktuellen String hinzufügen } else { / aktiuellen String der Stringtabele zufügen / neuen String anlegen z=zz; / Zeichenzähler auslesen i=i+1; / Neue Zeile zz=0; / Zeichenzähler rücksetzen } } Die Stringverarbeitung habe ich nur agebeutet. LG Andre' Zitieren
FinalFantasy Geschrieben 17. November 2008 Geschrieben 17. November 2008 Die Notation kommt von Managed C++. Also C++ mit .NET. Microsoft hat da die Syntax etwas erweitert. Wie lautet denn die Fehlermeldung genau? Enthält das Array denn Strings nach dem Aufruf von ReadAllLines, sprich: konnte wirklich was gelesen wurden? Liegt die auszulesende Datei benutzer.txt im Arbeitsverzeichnis des Programms? (Das kann auch vom Speicherort der .exe-Datei abweichen!) Gegebenfalls würde ich es mal mit einer absoluten Pfadangabe zur Datei versuchen, also wirklich "c:\\benutzer.txt" angeben. (Die Datei sollte dann natürlich auch direkt unter c: hinterlegt sein). Zitieren
AndiE Geschrieben 17. November 2008 Geschrieben 17. November 2008 Hallo, Was soll das bedeuten? array<String^>^ lines = File::ReadAllLines("benutzer.txt"); Mit dem Text hinter dem Gleichheitszeichen komme ich noch klar, aber das davor... Zitieren
Klotzkopp Geschrieben 17. November 2008 Geschrieben 17. November 2008 Siehe hier: ^ (Handle to Object on Managed Heap) Das ist Managed C++, die C++-Variante von .NET. Das ist auch der Grund, warum ich den Thread aus dem C++-Forum hierhin verschoben habe. Zitieren
FinalFantasy Geschrieben 17. November 2008 Geschrieben 17. November 2008 Ich steck jetzt auch nicht so tief in managed C++ drin, aber soweit ich weiß, gibts da keine Pointer im C-Sinne mehr (die wären ja auch unmanaged). Der Ersatz ist das ^. Ich nenn das jetzt einfach mal "Verweis" um es nicht mit Referenzen gleichzusetzen. Das vor dem Gleichheitszeichen ist als ein Verweis auf ein Array mit Verweisen auf Strings, also das Äquivalent zu etwa "std::vector<std::string*>* array". Managed C++ verwendet auch eine Art GarbageCollector, der eben diese Verweise verwaltet und sich ums Löschen kümmert, soweit ich weiß. Sollte ich jetzt hier was falsches Erzählen, lasse ich mich gerne Berichtigen. Aber meine persönliche Meinung: Ich hab mich selbst nur kurz mit managed C++ befasst, und habe eigentlich keine Vorteile gegenüber C# entdecken können, ausser dass die Sytnax "unschöner" ist als von C#. Deshalb: Wenn schon .NET, dann doch auch gleich mit C#. (<- meine persönliche Meinung!!!!!) Zitieren
AndiE Geschrieben 17. November 2008 Geschrieben 17. November 2008 Hallo, puh, das war ja was. Erstmal danke für die zahlreichen Tipps. Ich habe MSDN gelesen. Ich interpretiere den Quelltext mal: 1. Lege ein Feld von String lines aus der Textdatei "benutzer.txt" an 2. Für alle Strings line im Feld lines 3. IF line leer ist, Then ... In der if-Anweisung sehe ich das Problem. Soweit ich das gesehen habe, hat diese Klasses String keinen Operator "==" oder "!=" definiert. Die Anweisung ruft deshalb den Konstruktor auf, und vergleicht ihn. Das funtioniert meist irgendwie nicht. zum Vergleich der Operator aus VC++6: BOOL operator ==( const CString& s1, const CString& s2 ); Das Problem hat man auch, wenn man Klassen mit "==" vergleichen will, ohne diesen Operator definiert zu haben. Deshalb würde ich beim Beispiel die String.length-Funktion anwenden, und auf 0 testen. LG Andre' Zitieren
FinalFantasy Geschrieben 17. November 2008 Geschrieben 17. November 2008 (bearbeitet) Ahh, hehe, tricky. Ich weiß jetzt nicht genau, wie sich das mit den ^-Handles verhält, aber du hast ja string^ und nicht string. Dass die string-Klasse keinen == Operator hat, kann ich mir kaum vorstellen, aber ich könnte mir vorstellen, dass der hier nicht greift, weil du nicht die Strings vergleichst, sondern deren Handles, und die dürften so gut wie IMMER unterschiedlich sein. string* a, b; a == b;[/PHP] funktioniert auch nicht, weil du hier die Pointer vergleichst und nicht die Strings. Weil man Pointer aber vergleichen kann, gibts auch keinen Compilerfehler, den du ja anscheinend auch nicht kriegst. Hätte die String-Klasse keinen Vergleichsoperator, müsstest du aber einen kriegen. In C++ (ohne Managed), müsste man hier die Pointer dereferenzieren: [PHP]*a == *b; würde funktionieren. Ich kann dir aber leider nicht sagen, wie das mit den ^-Dingern funktioniert. Aber hier sitzt vermutlich der Fehler. Statt mit == zu vergleichen, gibts aber auch sicher eine compare- oder equals-Methode. Statt (line != "") könntest du also auch (!line.equals("")) schreiben, was auch wieder funktionieren würde. (bzw. (!line->equals(""), falls Managed C++ hier auch noch zwischen "Pointer" und Objekt unterscheidet). Statt length auf 0 zu prüfen, gibts bestimmt auch eine isEmpty-Methode oder sowas ähnliches. Bearbeitet 17. November 2008 von FinalFantasy Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.