Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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'

Geschrieben

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).

Geschrieben

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!!!!!)

Geschrieben

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'

Geschrieben (bearbeitet)

Ahh, hehe, tricky. :D

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 von FinalFantasy

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...