Text von Datei einlesen



  • Hallo,

    ich möchte ein Text von einer Datei einlesen und verwende folgenden Code:

    TStringList* lines = new TStringList();
    lines->LoadFromFile ("F:\\test.txt");
    String S;
    for(int i=0; i<lines->Count; i++)
       {
       Memo1->Clear();
       S = lines->Strings[i];
       String S2 = S.SubString(0,1);
       Memo1->Lines->Add(S2);
       S.Delete(0,1);
       }
    

    Das Problem ist, der Text wird erst ab der 4. Zeile eingelesen und die ersten 3 werden nicht berücksichtigt. Ich möchte aber den ganzen Text einlesen.
    i ist aber 0.

    Gruß Alex



  • a) warum löschst du in jedem Schleifendurchlauf den bereits geschriebenen Memo-Inhalt?
    b) der AnsiString-Index beginnt bei 1, nicht bei 0
    c) wozu löschst du etwas aus S, wenn im nächsten Durchlauf S ohnehin wieder komplett überschrieben wird?
    d) delete lines; nicht vergessen



  • @Jansen
    Sorry, der Code ist nur zu Testzwecken entstanden, weil ich sehen wollte warum es nicht tut.
    Der richtigen Code:

    IBTable1->Active = true;
    TStringList* lines = new TStringList();
    if (OpenDialog1->Execute())
       {
       lines->LoadFromFile(OpenDialog1->FileName);
       }
       IBTable1->Active = true;
    String S;
    IBTable1->Edit();
    for(int i=3; i<lines ->Count; i++)
       {
       IBTable1->Append();
       S = lines->Strings[i];
       String S2 = S.SubString(1,1);
       IBTable1->FieldByName("Storno")->Value = S2;
       S2 = S.SubString (4,11);
    ...
    

    zu c) stimmt Du hast recht.
    zu d)delete lines. wie und wo muß das rein?



  • Jansen hats ja bereits gesagt, wenn du dass Memo wieder löschst, dann steht wohl auch nichts drin außer der letzte Buchstabe, und jetzt schalte ich mal meine Kristallkugel an, und sage dir, dass deine test.txt genau 4 Zeilen hat, stimmt's???

    Dass der AnsiString-Index bei 1 Anfängt ist klar, ich hab mal rumprobiert, es funktioniert auch mit allen niedrigeren Zahlen, habs mal mit -23 probiert... Das soll jetzt nicht heißen, dass man es nicht richtig machen sollte...

    Und ich würde das ganze so machen, um mir etwas Schreibarbeit zu ersparen:

    TStringList* lines = new TStringList();
    	lines->LoadFromFile ("C:\\test.txt");
    	for(int i=0; i<lines->Count; i++)
       		Memo1->Lines->Add(lines->Strings[i][1]);
    	delete lines;
    

    Das sind jetzt ganze 6 Zeilen weniger... 😉

    PS: Mit delete lines gibst du die TStringList wieder frei. Jetzt dürfte dir klar sein, dass es da stehen muss, wo du die List nicht mehr benötigst...


Anmelden zum Antworten