Datei automatisch erkennen



  • Hallo.
    Arbeite gerade an einem Tool.
    Leider kenne ich mich noch nicht so gut in argv/argc aus.

    Also ich möchte, dass mein Programm automatisch die Datei erkennt. Ohne das ich den expliziten Pfad eingeben möchte.
    Ich möchte nicht als Pfad "./meinedatei.txt" schreiben sondern er soll sich die selber hohlen.

    Hier mein Versuch:

    int main (int argc, TCHAR* argv[])
    {
    
    	string sAuslesen;
    	string sDefaultwert="keindefault";
    
    	fstream f;
    	f.open(argv[1], ios::in);
    
    	if (f.is_open())
    	{.........
    

    Klappt leider nicht. Was mache ich falsch?


  • Mod

    Jolle schrieb:

    Klappt leider nicht. Was mache ich falsch?

    Du unternimmst keinerlei Anstalten, das zu tun, was du beschrieben hast. Etwas so zu programmieren, wie man es immer macht und dabei ganz doll zu wünschen, dass es diesmal etwas anderes macht, funktioniert nunmal nicht.



  • SeppJ schrieb:

    Jolle schrieb:

    Klappt leider nicht. Was mache ich falsch?

    Du unternimmst keinerlei Anstalten, das zu tun, was du beschrieben hast. Etwas so zu programmieren, wie man es immer macht und dabei ganz doll zu wünschen, dass es diesmal etwas anderes macht, funktioniert nunmal nicht.

    Hmm ok.
    Könntet ihr mir viell. ein Lösungsweg vorschlagen wie ich mein Ziel erreichen kann.
    (

    Also ich möchte, dass mein Programm automatisch die Datei erkennt. Ohne das ich den expliziten Pfad eingeben möchte.
    Ich möchte nicht als Pfad "./meinedatei.txt" schreiben sondern er soll sich die selber hohlen.

    )


  • Mod

    Jolle schrieb:

    SeppJ schrieb:

    Jolle schrieb:

    Klappt leider nicht. Was mache ich falsch?

    Du unternimmst keinerlei Anstalten, das zu tun, was du beschrieben hast. Etwas so zu programmieren, wie man es immer macht und dabei ganz doll zu wünschen, dass es diesmal etwas anderes macht, funktioniert nunmal nicht.

    Hmm ok.
    Könntet ihr mir viell. ein Lösungsweg vorschlagen wie ich mein Ziel erreichen kann.
    (

    Also ich möchte, dass mein Programm automatisch die Datei erkennt. Ohne das ich den expliziten Pfad eingeben möchte.
    Ich möchte nicht als Pfad "./meinedatei.txt" schreiben sondern er soll sich die selber hohlen.

    )

    Ich bin mir nicht 100 % sicher, was du willst:

    1. Die Datei liegt immer im aktuellen Verzeichnis (also .). Lösung: Mittels Stringoperationen "./" vor den Namen schreiben
    2. Die Datei liegt irgendwo. Lösung: Ganz schön schwer. Erstens sind Dateisysteme Betriebssystemabhängig, das heißt, du musst entweder für ein bestimmtes System entwickeln oder ein halbwegs systemunabhängiges Framework wie beispielsweise boost::filesystem verwenden. Dann müsstest du den Verzeichnisbaum systematisch durchgehen und gucken in welchem Verzeichnis die Datei ist. Probleme: 1) Das kann ewig dauern. 2) Woher wissen, welches die richtige Datei ist? Eine Datei mit Namen README.txt findet man bestimmt mehrmals.
    3. Variante von 2: Die Datei liegt im aktuellen Suchpfad. Dies ist ähnlich zu 2., aber ohne die dortigen Probleme. Du liest die PATH Umgebungsvariable aus und gehst die Verzeichnisse nacheinander durch, bis die Datei gefunden ist.



  • Hey Danke für die Antwort.
    Also da es sich um eine .ini Datei handelt, wird sie nur einmal im Verzeichnis vorkommen.


  • Mod

    Jolle schrieb:

    Hey Danke für die Antwort.
    Also da es sich um eine .ini Datei handelt, wird sie nur einmal im Verzeichnis vorkommen.

    Ich meine bei Punkt 2 nicht mehrmals in einem Verzeichnis - das geht gar nicht - sondern mehrmals auf der Platte in verschiedenen Verzeichnissen. Diese Bemerkung mag für deinen Fall irrelevant sein, ich bin mir wie gesagt von deinen Beiträgen her nicht sicher wie viel du schon über den Pfad weißt. Je nachdem wie viele Informationen du schon hast, kann die Lösung des Problems zwischen trivial (Punkt 1) über mäßig (Punkt 3) bis hin zu hammerhart (Punkt 2) sein.



  • http://www.c-plusplus.net/forum/viewtopic-var-t-is-248888.html

    Von dem Pfad schneidest du Zeichen ab, die nach dem letzten "/" kommen und hängst den Namen der Datei an. Fertig.



  • Kann es sein, dass du einfach so etwas suchst?

    int main (int argc, TCHAR* argv[])
    {
    
        string sAuslesen;
        string sDefaultwert="keindefault";
    
        fstream f;
    if(argc <= 1)
    {
    f.open("tolleDatei.ini", ios::in);
    }
    else
    {
        f.open(argv[1], ios::in);
    }
    
        if (f.is_open())
        {.........
    


  • Was er meint ist sowas wie GetCurrentDir() oder ApplicationDir();



  • Ich verstehe das genauso, wie Icematix.

    Er brauch das aktuelle Verzeichnis und hängt dann die .ini an.
    Also einfach alles hinter dem letzten "/" entfernen.

    Dazu ist vielleicht:

    std::string und deren Funktionen "find_last_of" und "erase"

    mal anschauen. Und dann hinter den letzten "/" einfach den Namen der .ini-Datei anhängen.



  • So mache ich es unter Windows:

    std::wstring GetBasePath()
    {
        std::vector<wchar_t> appPath(MAX_PATH);
        GetModuleFileNameW(NULL, &appPath[0], static_cast<DWORD>(appPath.size()));
        std::wstring helper(&appPath[0]);
    
        size_t found;
        found = helper.find_last_of("/\\"); //Funktioniert sowohl bei Win-Pfaden "\" sowie bei anderen "/"
        helper.assign(helper.substr(0,found+1));
    
        return helper;
    }
    

Anmelden zum Antworten