Problem mit der while Schleife



  • Leider nicht...



  • Hatt den keiner noch eine Idee, werde noch total verrückt mit dem Problem.
    Bitte um Hilfe!



  • Hmm... stell mal die Reihenfolge der Dateinamen um, also zuerst die xyz.htm, wenn die dann als nicht gefunden erkannt wird, dann stimmt deine Überprüfung, aber deine Schleife nicht :). Wär vielleicht'n Anfang, herauszufinden, wo der Fehler überhaupt liegt.

    cya

    [ Dieser Beitrag wurde am 26.12.2002 um 10:45 Uhr von MagiC Creator editiert. ]



  • Also...

    Datei:
    xyz.htm
    forumstart.htm
    forumstart.htm

    Ausgabe:
    Datei nicht gefunden! Datei nicht gefunden! Datei gefunden!

    Das "BOOL result = false;" hab ich jetzt nochmal nach oben getan.

    // > bcc32 http_request.cpp -l wininet.lib
    
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <wininet.h>
    #include <iostream>
    #include <fstream.h>
    #include <string>
    using namespace std;
    
    const DWORD FILE_OK = 3158066;
    HINTERNET hnet, hhost, hdata;
    DWORD status = 0;
    DWORD size = sizeof(DWORD);
    BOOL result = FALSE;
    char buffer[80];
    
    int main()
    {
    
        hnet  = InternetOpen("Inet",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
            hhost = InternetConnect(hnet,"www.c-plusplus.net",INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,0);
    
            ifstream file;
        file.open("string.dat", ios::in | ios::binary);
    
        if (!file.is_open())
                cout << "Error opening file"; 
    
            while (!file.eof())
            {
            file.getline(buffer,80);
    
            hdata = HttpOpenRequest(hhost,"HEAD",buffer,NULL,NULL,NULL,0,0);
    
            if(hdata == NULL)
                    result = FALSE;
    
                HttpSendRequest(hdata,NULL,0,0,0);
    
                if(HttpQueryInfo(hdata,HTTP_QUERY_STATUS_CODE,&status,&size,0))
                        if(status == FILE_OK)
                            result = TRUE;
    
                if(result == TRUE)
                        cout << "Datei vorhanden!";
                else
                        cout << "Datei nicht vorhanden!";
            }
    
        file.close();
    
        getchar();
    
        InternetCloseHandle(hdata);
        InternetCloseHandle(hhost);
            InternetCloseHandle(hnet);
    
        return 0;
    }
    


  • Wie gesagt so kann es nicht klappen, weil result dann sobald eine Datei gefunden wurde auf true gesetzt wird. Es wird aber nie mehr zurückgesetzt! Also entweder ein result=false an den Anfang der while Schleife oder

    if(status == FILE_OK)
                        result = TRUE;
             else
                        result = FALSE;
    

    Wenn es dann nicht klappt, hab ich keine Ahnung, aber geh doch mal mit Einzelschritten durch das Programm mit deinem Debugger und guck dir result an!



  • Gibt das Gleiche in grün

    Ausgabe:
    Datei nicht gefunden! Datei nicht gefunden! Datei gefunden!



  • Schreib mal unter "cout << "Datei nicht gefunden!"" noch "result = FALSE;", vielleicht funktioniert's dann.

    cya



  • Leider nicht



  • Original erstellt von <eonic+d>:
    **Gibt das Gleiche in grün

    Ausgabe:
    Datei nicht gefunden! Datei nicht gefunden! Datei gefunden!**

    Zeig doch mal bitte den Code wo du das drinhast, ich kann mir das nicht recht vorstellen.



  • #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <wininet.h>
    #include <iostream>
    #include <fstream.h>
    #include <string>
    using namespace std;

    const DWORD FILE_OK = 3158066;
    HINTERNET hnet, hhost, hdata;
    DWORD status = 0;
    DWORD size = sizeof(DWORD);

    char buffer[80];

    int main()
    {

    hnet = InternetOpen("Inet",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
    hhost = InternetConnect(hnet,"www.c-plusplus.net",INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,0);

    ifstream file;
    file.open("string.dat", ios::in | ios::binary);

    if (!file.is_open())
    cout << "Error opening file";

    while (!file.eof())
    {
    BOOL result = FALSE; // Ist doch richtig, oder?
    file.getline(buffer,80);

    hdata = HttpOpenRequest(hhost,"HEAD",buffer,NULL,NULL,NULL,0,0);

    if(hdata == NULL)
    result = FALSE;

    HttpSendRequest(hdata,NULL,0,0,0);

    if(HttpQueryInfo(hdata,HTTP_QUERY_STATUS_CODE,&status,&size,0))
    if(status == FILE_OK)
    result = TRUE;

    if(result == TRUE)
    cout << "Datei vorhanden!";
    else{
    cout << "Datei nicht vorhanden!"; result = FALSE;}

    }

    file.close();

    getchar();

    InternetCloseHandle(hdata);
    InternetCloseHandle(hhost);
    InternetCloseHandle(hnet);

    return 0;
    }



  • Sorry da weiß ich wirklich nicht weiter.



  • Probier mal normale Strings aus, die nicht aus der Datei kommen, vielleicht stimmt was am Einlesen der Datei nicht.

    cya



  • Wie würdet ihr es denn machen, wenn ihr Strings aus einer Text Datei einlesen und per HttpOpenRequest einzeln überprüfen müsstet?



  • zu spät gesehen...

    @Magic

    das habe ich schon gemacht und da funzt es, nur weil es sehr viele später einmal werden sollen, wollte ich die in einer Datei anlegen



  • Also wenn du Strings nimmst funzt es? Probier mal nen String-Array in deiner while-Schleife. Wenn das dann auch noch funzt, dann stimmt was mit dem Auslesen nicht.

    cya



  • Weiss jetzt nicht ob ich das jetzt so richtig verstehe, denn die while Schleife hab ich nur deswegen eingeführt wegen dem Datei Handling, denn als ich das mit den Strings gemacht habe, hatte ich eine for Schleife verfendet.

    Den Code hatte ich aber auch nur von Kane bekommen:

    #define WIN32_LEAN_AND_MEAN
    
    #include <windows.h>
    #include <wininet.h> //wininet.lib linken
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    const DWORD FILE_OK = 3158066;
    
    bool TestFile(string path);
    HINTERNET hnet,hhost;
    
    int main()
    {
        char host[50];
        string files[2] = {{"index.asp"}, {"home.asp"}};
    
        cout << "Hostname: ";
        cin >> host;
    
        hnet = InternetOpen("Inet",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
        hhost = InternetConnect(hnet,host,INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,0);
    
        if((hnet || hhost) == NULL)
            cout << "Error! Keine Verbindung\n";
    
        for(int i=0; i<2; i++)
        {
            if(TestFile(files[i]))
            {
                cout << "File: " << files[i] << "\t[   Ok   ]\n";
            }
            else
            {
                cout << "File: " << files[i] << "\t\t[ Failed ]\n";
            }
        }
    
        getchar();
    
        InternetCloseHandle(hhost);
        InternetCloseHandle(hnet);
    
        return 0;
    }
    
    bool TestFile(string path)
    {
        DWORD status = 0;
        DWORD size = sizeof(DWORD);
        bool result = false;
    
        HINTERNET hdata = HttpOpenRequest(hhost,"HEAD",path.c_str(),NULL,NULL,NULL,0,0);
        if(hdata == NULL)
            return result;
        HttpSendRequest(hdata,NULL,0,0,0);
    
        if(HttpQueryInfo(hdata,HTTP_QUERY_STATUS_CODE,&status,&size,0))
            if(status == FILE_OK)
                result = true; // Datei ok
    
        InternetCloseHandle(hdata);
        return result;
    }
    


  • Und das funktioniert? Ok. Dann würde ich gleich die Funktion TestFile weiternehmen, nicht alles in die main schreiben. Also irgendwas an deinem Datei-Zeugs stimmt nicht... bloß was?

    cya



  • Ja gut aber hier sind es ja auch nur 2 string normal sind es ca.90 die überprüft werden sollen, dabei wird dann doch ein wenig der code zu unübersichtlich.

    wenn du mir sagen könntest, wie ich die Funktion benutzen kann kombiniert mit dem datei handling.



  • In buffer steht ja dann die URL, die übergibst du einfach der Funktion. Lass mal den Debugger drüberlaufen, und prüf nach, ob das richtige aus der Datei gelesen wird.

    cya



  • ES FUNKTIONIERT!!!

    #define WIN32_LEAN_AND_MEAN
    
    #include <windows.h>
    #include <wininet.h> //wininet.lib linken
    #include <iostream>
    #include <string>
    #include <fstream.h>
    
    using namespace std;
    
    const DWORD FILE_OK = 3158066;
    
    bool TestFile(string path);
    HINTERNET hnet,hhost;
    
    int main()
    {
        char host[50];
    
        cout << "Hostname: "; cin >> host;
    
        hnet = InternetOpen("Inet",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
        hhost = InternetConnect(hnet,host,INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,0);
    
        if((hnet || hhost) == NULL)
            cout << "Error! Keine Verbindung\n";
    
        ifstream file;
        file.open("string.txt", ios::in);
    
        string adress;
        adress.resize(256);
    
        while(!file.eof())
        {
            // Scan-String aus Datei lesen
            file.getline((char*)adress.c_str(),adress.size());
    
            if(TestFile(adress))
                cout << "File: " << (char*)adress.c_str() << "[TRUE]\n";
                else
                cout << "File: " << (char*)adress.c_str() << "[FALSE]\n";
        }
    
        file.close();
    
        InternetCloseHandle(hhost);
        InternetCloseHandle(hnet);
    
        return 0;
    }
    
    bool TestFile(string path)
    {
        DWORD status = 0;
        DWORD size = sizeof(DWORD);
        bool result = false;
    
        HINTERNET hdata = HttpOpenRequest(hhost,"HEAD",path.c_str(),NULL,NULL,NULL,0,0);
    
        if(hdata == NULL)
            return result;
    
        HttpSendRequest(hdata,NULL,0,0,0);
    
        if(HttpQueryInfo(hdata,HTTP_QUERY_STATUS_CODE,&status,&size,0))
            if(status == FILE_OK)
                result = true;
    
        InternetCloseHandle(hdata);
        return result;
    }
    

Anmelden zum Antworten