String-Arrays



  • Hallo,

    das folgende Programm liest eine Textdatei ein, zerlegt alle Zeilen in Spalten (die durch Leerzeichen oder Semikolon getrennt sind), und speichert dann von allen Zeilen jeweils die dritte Spalte als neue Datei ab. Das Programm verwendet nur ein einziges String-Array, das überschrieben wird.

    int i;
    				array<String^> ^input;
    				input = File::ReadAllLines("input.txt", System::Text::Encoding::UTF7);
    				array<Char> ^chars = {' ',';'};
    				try{
    					for (i = 0; ; i++){
    						array<String^> ^zeile = input[i]->Split(chars, StringSplitOptions::RemoveEmptyEntries );
    						input[i] = zeile[2];                         
    					}
    				} catch(...) {};
    				File::WriteAllLines("output.txt", input);
    

    Das Programm tut was es soll, aber ich bitte um eure Kommentare was man daran besser oder einfacher machen könnte.
    Wie kann man abfragen, wieviele Zeilen das Array enthält? Die Erkennung des Dateiendes über try/catch gefällt mir nicht so richtig.

    Im nächsten Schritt wollte ich ein zweites String-Array verwenden, damit ich das erste nicht überschreiben muss:

    int i;
    				array<String^> ^input;
                    array<String^> ^output;
    				input = File::ReadAllLines("input.txt", System::Text::Encoding::UTF7);
    				array<Char> ^chars = {' ',';'};
    				try{
    					for (i = 0; ; i++){
    						array<String^> ^zeile = input[i]->Split(chars, StringSplitOptions::RemoveEmptyEntries );
    						output[i] = zeile[2];                         
    					}
    				} catch(...) {};
    				File::WriteAllLines("output.txt", output);
    

    Das ergibt nun eine System.ArgumentNullException.
    Irgendwas stimmt nicht mit der Definition des zweiten String-Arrays.
    Wo ist der Fehler?

    Gruß
    Michael



  • Hallo,

    sehe ich das richtig, dass das zweite String-Array zuerst mit

    output = gcnew array<String^>(1000);
    

    erzeugt werden muss, wobei ich eine feste Anzahl von Zeilen angeben muss?
    Ich möchte eine Text-Datei erzeugen und abspeichern, deren Zeilen-Anzahl erst zur Laufzeit festgelegt wird. Sehe ich das richtig, dass das nicht mit WriteAllLines() geht, weil das String-Array nicht dynamisch vergrössert werden kann? Wie muss ich vorgehen, wenn ich die Anzahl der Zeilen dynamisch vergrössern möchte?

    Gruß
    Michael



  • Hallo Michael,

    benutze dafür die generischen Container-Klassen, z.B. List<>.
    Und dann kannst du mittels der Add-Methode dynamisch den Container vergrößern.



  • warum nicht einfach bei deiner Schleife

    for(i=0; i < input->Length; i++)
    

    ?
    das mit dem try catch kannste dir dann sparen.
    außerdem legst du jedesmal in deiner schleife mit

    array<String^> ^zeile = input[i]->Split(chars, StringSplitOptions::RemoveEmptyEntries );
    

    das array<String>zeile neu an. (kostet Zeit und Speicher)
    Leg es einmal vor der Schleife an und überschreib doch dann einfach den inhalt.

    deine System.ArgumentNullException kommt davon das du dein array output nicht richtig erzeugt hast. du hast es zwar deklariert aber nicht definiert. Arrays sind was feines wenn sich zur laufzeit nix ändert, ist das jedoch der fall nimm immer listen! (System::Collections::Generic::List)

    my 2 cents



  • Hallo,

    teddds schrieb:

    warum nicht einfach bei deiner Schleife

    for(i=0; i < input->Length; i++)
    

    ?

    Ist input->Length die Anzahl der Zeilen? Ich habe gedacht das wäre die Gesamtlänge der Textdatei.

    Danke für die anderen Hinweise.

    Gruß
    Michael

    P.S. Du hattest völlig Recht, "Length" ist die Anzahl der Elemente des Arrays. Danke!


Anmelden zum Antworten