Wo ist mein Denkfehler ?



  • Das Programme gibt mir nur sowas zurück ||||||22

    ist doch alles richtig oder ?
    Danke.

    //------------------------------------------------------------------
    #include <afx.h>
    #include <iostream>
    using namespace std;

    LPCTSTR FindAllFile()
    {

    CFileFind finder;

    BOOL bWorking = finder.FindFile("."); // Alle Datei im Verzeichnis
    //finden
    while (bWorking)
    {
    bWorking = finder.FindNextFile();
    return (LPCTSTR)finder.GetFileName();// Datei auf Schirm liefern

    }
    return "no file in the directory";
    }

    int main (){

    LPCTSTR FileName;

    FileName = FindAllFile();

    cout<<FileName<<endl; Ausgabe

    return 0;
    }



  • armando schrieb:

    ist doch alles richtig oder ?

    Nein.

    return (LPCTSTR)finder.GetFileName();

    Wie begründest du diesen cast?
    Nur als Hinweis: "Weil sonst der Compiler meckert" sollte nie eine Begründung für einen cast sein.



  • der cast ist nur für die Ausgabe von Cstring auf dem Bilschirm.
    So läuft das Programm Problemlos.

    int main (){

    CFileFind finder;

    BOOL bWorking = finder.FindFile(".");

    while (bWorking)
    {
    bWorking = finder.FindNextFile();
    cout<<(LPCTSTR)finder.GetFileName()<<endl; char*
    }
    return 0;
    }



  • Außerdem gibst du bereits im ersten Durchlauf der bWorking-Schleife den Dateinamen zurück. Somit ist die Schleife sinnlos und könnte durch ein If ersetzt werden. Beschreibe bitte erstmal was das Programm eigentlich machen soll. Soll nur eine Datei gefunden werden oder alle? Und benutz Code-Tags (zum zweiten Mal).



  • armando schrieb:

    der cast ist nur für die Ausgabe von Cstring auf dem Bilschirm.
    So läuft das Programm Problemlos.

    So läuft das Programm auch ohne cast. Probier's aus.

    Und wie asdrubael schon sagte: Dir muss klar sein, dass durch das return die Schleife abgebrochen wird. Das ist vermutlich nicht das, was du willst.

    Schau auch mal in die MSDN Library, wie lange der Zeiger, den CString::operator LPCTSTR zurückgibt, gültig ist.



  • Der Rückgabewert von CFileFinder::GetFileName ist hier ein temporäres Objekt, und lebt daher maximal so lange, bis der Block, in dem er erzeugt wurde, verlassen wird. Dein LPCTSTR zeigt also danach ins Leere.



  • Vielen Dank für die Bemerkung mit dem if Schleife.
    Ich möchte eine Routine schreiben der mir die erste
    Textdatei aus dem Verzeichnis ausgibt. Das ist eigentlich mein Ziel.
    Deswegen lasse ich mir erstmal alle Datei ausgeben und dann werde
    ich die erste Textdatei lesen.

    //

    =============================================================================#include <afx.h>
    #include <iostream>
    using namespace std;
    
    LPCTSTR FindAllFile()
    {
    
       CFileFind finder;
    
       BOOL bWorking = finder.FindFile("*.*"); // Alle Dateien suchen
    
       if (bWorking)
       {
          while (bWorking)
    	  {
            bWorking = finder.FindNextFile();   // Nächste Datei finden
     	    return (LPCTSTR)finder.GetFileName();  
          }
       }
       else
       {
           return "no file in the directory";
       }
    }
    
    int main (){
    
      cout<<FindAllFile()<<endl; // Alle Dateien auf Bildschirm anzeigen
    
      return 0;
    }
    


  • Gib doch einfach ein CString Objekt zurück, dann bist du schon mal einige Probleme los. Auch wenn hier das C++ Forum ist und man dafür eigentlich std::string bzw. std::wstring verwendet.

    btw:
    denk nochmal über deine Worte "if Schleife" nach 😉


Anmelden zum Antworten