Datei Einlesen in ein Memofeld



  • Hallo und Guten Morgen

    Ich habe ein Problem mit dem Einlesen von einer Datei in ein Memofeld.

    // Soweit habe ich es hinbekommen und es läuft auch 
    
    Memo1->Lines->LoadFromFile("test.dat"); // Hier liegt das Problem
    

    Das Problem liegt darin das ich die Datei fest angeben tuhe, aber unser Projekt soll ja auch andere Dateien einlesen. z.b. test123.dat.

    Ich dachte mir villeicht das ich überprüfe ob die endung .dat vorhanden ist und dann die datei laden tuhe die eine Endung .dat besitzt.

    Mit Opendialog wollte ich nicht arbeiten weiß auch nicht so recht ob dies
    so realisierbar wäre.

    Wäre für eine Lösung dankbar

    MFG



  • äh, woher 'weiß' denn Dein Programm, welche Datei es einlesen soll, wenn es mehrere gibt?

    Schau Dir mal TSearchRec an.



  • Es liegt ja im Ordner immer nur eine Datei .dat in dem Ordner nicht mehrere nur der Anfang der Datei test.dat oder test123.dat der ändert sich.

    aber wenn ich es fest vorgebe will das Programm ja immer die test.dat lesen.

    Die Aufgabe in der Schule was wir haben lautet:

    Laden Sie in eine Memofeld eine Datei test.dat. Das Programm soll ausserdem Dateien lesen mit der Endung .dat , wobei die Datei nicht Test.dat heissen soll
    sondern test123.dat, test1234.dat. Löschen Sie die Datei test.dat aus dem ordner und Tauschen sie sie mit der Datei test123.dat oder test.1234.dat aus ohne Änderung an dem Haupsächlichen Programm vorzunehmen.



  • So richtig versteh ich das noch nich, aber vielleicht sollte er sich mal ExtractFilePath() anschauen??



  • TOpenDialog verwenden, Hilfe lesen, Beispiel unter Methode Execute anschauen, fertig...



  • Nein, TSearchRec sollte schon genügen...



  • Also ich komm damit nich zurecht:

    er findet nix...

    TSearchRec sr;
    AnsiString Path = Edit1->Text;
    FindFirst(Path,faAnyFile,sr);
    Label1->Caption=sr.Name;
    


  • AnsiString SearchDir = "c:\\verzeichnisname\\"; // \\ am Ende ist wichtig!
    AnsiString SearchFiles = "*.dat";
    TSearchRec sr;
    int iAttributes = 0;
    AnsiString DatDatei;
    
    if (FindFirst(SearchDir + SearchFiles, iAttributes, sr) == 0)
    {
    //	do
    //	{
    		int curAttrib = FileGetAttr(SearchDir + sr.Name);
    		if (curAttrib & faDirectory)
    			continue;  // Unterverzeichnisse ignorieren, auch wenn sie mit .dat enden
    		DatDatei = sr.Name; // enthält die erste gefundene Datei mit der Endung .dat
    //	} while (FindNext(sr) == 0);
    }
    FindClose(sr);
    

    Die auskommentieren Zeilen zeigen, wie das Ganze in einer Schleife funktionieren würde, die alle .dat-Dateien durchiteriert.
    Natürlich kann man dann keinen AnsiString (DatDatei) mehr verwenden, sondern muss z.B. eine TStringList verwenden, um die Dateinamen zwischenzuspeichern.



  • ok, und wie kann ich pfad per Edit eingeben, meins oben hat ja nich funktioniert!

    Wie kann ich anzahl der Files in dem ordner ermitteln, damit ich dann serachnext machen kann??



  • hm, soll ich gleich die ganze Hausaufgabe für Dich machen? 😉

    Ich finde ein bißchen eigenen Hirnschmalz kannst Du auch investieren. Eine Zählvariable solltest Du schon selbst hinbekommen. Und wie man einem AnsiString den Text eines Edits zuweist auch. Um sicher zu stellen, dass am Ende ein \\ enthalten ist: IncludeTrailingBackslash(...)



  • Och Joe!

    ICh schaffs net:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    TSearchRec sr;
    AnsiString Path = IncludeTrailingBackslash(Edit1->Text);
    FindFirst(Path,faAnyFile,sr);
    Memo1->Lines->Add(sr.Name);
    FindNext(sr);
    Memo1->Lines->Add(sr.Name);
    
    }
    

    geht net, und wie ich anzahl an *.txt Dateien in dem Ordner finden kann weiß ich auch net!!!!! Hilf mir bitte!



  • Was tippst Du denn im Editfeld ein?

    Schau Dir bitte nochmal mein Beispiel in Ruhe an.

    Grüße Joe_M.



  • ich tippe c:\, c:\, c:\., c:\*.*!

    Nix geht!



  • Wie wärs damit?

    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    AnsiString SearchDir = Edit1->Text; // \\ am Ende ist wichtig!
    AnsiString SearchFiles = Edit2->Text;
    TSearchRec sr;
    int iAttributes = 0;
    AnsiString DatDatei;
    Memo1->Clear();
    if (FindFirst(SearchDir + SearchFiles, iAttributes, sr) == 0)
    {
       do
        {
    
            int curAttrib = FileGetAttr(SearchDir + sr.Name);
            if (curAttrib & faDirectory)
                continue;  // Unterverzeichnisse ignorieren, auch wenn sie mit .dat enden
            DatDatei = sr.Name; // enthält die erste gefundene Datei mit der Endung .dat
            Memo1->Lines->Add(sr.Name);
                } while (FindNext(sr) == 0);
    }
    FindClose(sr);
    }
    


  • Gast2 schrieb:

    ich tippe c:\, c:\, c:\., c:\*.*

    nur das erste dürfte gehen, 3. und 4. sind keine Pfadangaben, 2. wird dann zu C:\\\

    es müßte sogar C: reichen

    und schau dir das Beispiel von Joe NOCHMAL genau an, speziell die Zeile mit FindFirst



  • Ah danke @5erial und Joe, es geht doch...sorry!

    Nur die Sache mit dem erkennen, wieviele Dateien meiner Auswahl in dem Ordner sind weiß ich noch nicht, wie geht das?



  • hallo? 😕



  • Hallo

    steht in

    Memo1->Lines->Count
    

    bis bald
    akari



  • nein ich möchte das vorher wissen, wieviel dateien in einem ordner sind, bevor ich es ins memo lesen!



  • Hallo

    Dann mußt du die Dateinamen erstmal zwischenspeichern :

    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    AnsiString SearchDir = Edit1->Text; // \\ am Ende ist wichtig!
    AnsiString SearchFiles = Edit2->Text;
    TSearchRec sr;
    int iAttributes = 0;
    AnsiString DatDatei;
    TStringList *Buffer = new TStringList(); // Zwischenspeicher für Dateinamen
    Memo1->Clear();
    if (FindFirst(SearchDir + SearchFiles, iAttributes, sr) == 0)
    {
       do
        {
    
            int curAttrib = FileGetAttr(SearchDir + sr.Name);
            if (curAttrib & faDirectory)
                continue;  // Unterverzeichnisse ignorieren, auch wenn sie mit .dat enden
            DatDatei = sr.Name; // enthält die erste gefundene Datei mit der Endung .dat
            Buffer->Add(sr.Name);
                } while (FindNext(sr) == 0);
    }
    FindClose(sr);
    
    // Jetzt kannst du aus Buffer->Count die Anzahl an Dateien lesen
    Memo1->Lines->Assign(Buffer); // Schreibt die Namen in das Memo
    delete Buffer;
    }
    

    bis bald
    akari



  • ah danke, werd das morgen gleich mal austesten!


Anmelden zum Antworten