ifstream.open(...) Akzeptiert nur absolute Pfade?



  • hallo!

    Kann mir jemand sagen, warum

    ifstream f;
    f.open("D:\\building.dat", ios::in)
    

    aus

    #include <fstream>
    

    nur Absolute Pfade haben möchte?

    f.open("D:\\building.dat", ios::in)
    

    im Ausführungsverzeichnis funktioniert nicht 😞

    Christoph



  • Dieser Thread wurde von Moderator/in Unix-Tom aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hi SchlitzInDaHouse,

    Ich schätze du meinst:

    f.open("building.dat", ios::in)
    

    Aber es wird auch ein relativer Pfad akzeptiert.
    Da du "erst" 31 Posts hast, frag ich mal vorsichtig, ob
    die Pfadangabe auch relativ zum build-Verzeichnis ist
    und nicht zu deinen Sourcen.

    Gruß,
    CSpille



  • Lass dir zuerst einmal den aktuellen Ordner ausgeben, wahrscheinlich ist der aktuelle Ordner gar nicht der den du vermutest (eigentlich bin ich mir da sogar sicher) und deswegen hast du besagtes Problem.



  • Ich hab mir den Ordner mal mit

    #include <windows.h>
    #include <stdio.h>
    
    void main()
    {
        DWORD   cchCurDir;
        LPTSTR  lpszCurDir;
        TCHAR   tchBuffer[MAX_PATH + 1];
        DWORD   nSize;
    
        lpszCurDir = tchBuffer;
        cchCurDir = MAX_PATH;
    
        nSize = GetCurrentDirectory(cchCurDir, lpszCurDir);
    
        printf("Current Directory is : %s\n", lpszCurDir);
    }
    

    ausgeben lassen. Er meint 😨

    Ich weiß echt nicht, wie er darauf kommt. Das Verzeichnis der Exe ist ein völlig anderes. Aber wenn ich meine Datei da hin kopiere klappt es auch nicht. Ich bekomme dann immer nur 100% Auslastung, und das Programm fängt an, speicher zu fressen 😞

    Christoph



  • SchlitzInDaHaus schrieb:

    ...Aber wenn ich meine Datei da hin kopiere klappt es auch nicht. Ich bekomme dann immer nur 100% Auslastung, und das Programm fängt an, speicher zu fressen :(...

    Die 100% Auslastung und der Speicherverbrauch deutet darauf hin das du eine Endlosschleife in deinen Programmcode hast (Falsche Abfrage des Dateiendes oder ähnliches).

    cu André



  • Funktioniert:

    f.open("D:\\Raytracing\\debug\\building.dat", ios::in);
    

    Funktioniert nicht:

    f.open("building.dat", ios::in);
    

    (100% auslastung)

    an der schleife liegts aber nicht. Die funktioniert ja im ersten fall.

    Aber vielleicht kann mir jemand ja noch nochmal ne andere Methode sagen das Ausführungsverzeichnis raus zu finden. Damit ich das nochmal überprüfen kann.

    😡 😡 😡



  • Versuch mal folgendes:
    Start->Ausführen dort "cmd" eingeben.
    Dann gibst du ein:
    cd D:<ENTER>
    cd Raytracing\debug<ENTER>
    "Dein Programmname ohne die Anführungszeichen"<ENTER>

    Dann sollte es gehen, wenn nicht würde ich vermuten, dass du eine Bibliothek dazugelinkt hast die an dem Current Directory rumspielt.



  • was die 100% CPU auslastung macht, findest du am einfachsten mit nem debugger raus



  • int main(int argc,char *argv[])
    

    in argv[0] steht der pfad zum ausgeführten programm,
    daraus kannst du dir auch das directory rausbasteln ...



  • das hängt auch wieder vom System ab 😉 (wenn du das Programm von der Kommandozeile aus startest, könnte dort auch der Name so stehen, wie du ihn angegeben hast - oder du bekommst gar einen Leerstring übergeben)



  • Habe gesehen, dass in der Titelleiste des Kommandozeilenfensters der Pfad auch steht. Wenn er stimmt ist er so, wie er sein soll. Das Problem mit

    f.open("building.dat", ios::in);
    

    besteht aber weiterhin. Vielleicht sollte ich mal versuchen, eine andere Methode zum Einlesen zu benutzen.

    Christoph



  • habs jetzt mal mit

    ifstream infile("building.dat");
    
    while (!infile.eof())
    {
       infile >> sTempline;
    }
    
    infile.close();
    

    versucht. Derselbe Mist.

    Und mit

    ifstream infile("D:\\Raytracing\\debug\\building.dat");
    

    klappt super.

    Und die Eingabeaufforderung zeigt immer schön genau das Verzeichnis an, in dem die exe und auch die building.dat drin ist. So ein scheissssssss!!!!!!

    😡 😡 😡 😡 😡



  • Versuchs mal mit

    ifstream infile("./building.dat");
    

    Außerdem solltest du aus Gründen der Plattformunabhängigkeit immer Slashes statt Backslashes verwenden...

    Grüße

    Martin



  • Funktioniert leider auch nicht 😞 Irgendwie ist da der Wurm drin.
    Aber danke.



  • Wie startest du die Eingabeaufforderung?



  • Ich starte sie direkt über das Ausführen von Visual Studio. Aber das Problem hat sich endlich erledigt. Es lag daran, dass die "building.dat" auf einem Linux-System erstellt worden ist, was ich nicht wusste. Und irgendwie hat er da wohl etwas anders interpretiert oder so. naja

    Aber an alle: Danke für die Hilfe!


Log in to reply