Mit C++ PHP Dateien auslesen

Wie übergeb ich die Parameter über die Dosshell? Kann man das auch so machen, dass dein Programm in eine andere Funktion kommt und die Main diese Funktion aufruft mit der URL als Parameter? Wenn ja, wie würde dann der Quellcode aussehen? Bei mir gibts als Fehler, ich komm mit den Datentypen in C++ noch nicht so klar. Ich blick da kaum durch!
 
Lumakrieger hat gesagt.:
Wie übergeb ich die Parameter über die Dosshell?
!? LOL :)google: )
Lumakrieger hat gesagt.:
Kann man das auch so machen, dass dein Programm in eine andere Funktion kommt und die Main diese Funktion aufruft mit der URL als Parameter?
NEIN! Stell dir mal vor es geht nicht:rolleyes:
Lumakrieger hat gesagt.:
Wenn ja, wie würde dann der Quellcode aussehen?
Was für ein Programm soll ich entwickeln?
Wie stehts mit meiner Bezahlung?
Lumakrieger hat gesagt.:
Bei mir gibts als Fehler, ich komm mit den Datentypen in C++ noch nicht so klar. Ich blick da kaum durch!
Das glaube ich dir...:rolleyes:

Und nun zum eigendlichen Problem:

Du willst also folgende Funktion haben:
Code:
char* download(char* URL),

Ich habe hier eine nützliche funktion geschrieben und getestet:

Code:
char* download(char* URL)
{ 
  #include <windows.h>
  #include <Wininet.h>
  #include <iostream>
  char output[10000]; //die maximale größe der HTML-Datei(Sehr wichtig!)
  HINTERNET hInternet;
  HINTERNET hFile;
  char  Buf[100];
  DWORD ReadSize;
  BOOL  bResult;
  int   nummer = 1;

  hInternet = InternetOpen(
            "Eine beliebige Browserkennung",
            INTERNET_OPEN_TYPE_PRECONFIG,
            NULL,
            NULL,
            0);

  hFile = InternetOpenUrl(
            hInternet,
            URL,
            NULL,
            0,
            INTERNET_FLAG_NO_CACHE_WRITE,
            0);

  for(;;)
  {
    ReadSize = 1;
    bResult = InternetReadFile(
            hFile,
            Buf,
            1,
            &ReadSize);  
    if(bResult && (ReadSize == 0))
      break;
    Buf[ReadSize] = '\0';
    strcat(output,Buf);
  }  
  InternetCloseHandle(hFile);
  InternetCloseHandle(hInternet);

  return output;
}

Binde sie in dein Programm mit ein.

Wenn du mehrere Variablen empfangen willst musst du nur meine oben gezeigte #-Zeichen Methode einbauen. Dann kannst du mehrere Variablen empfangen, was viel nützlicher ist(Variable1#Variable2#variable3)

PS: Wie man Parameter über die Dos-Shell übergibt ist eine SEHR dumme Frage da es zu selbstverständlich ist. "programm.exe parameter1" DAS HABE ICH ÜBRIGENS OBEN GEZEIGT!!:mad: "
 
Zuletzt bearbeitet:
Kaiser206 hat gesagt.:
PS: Wie man Parameter über die Dos-Shell übergibt ist eine SEHR dumme Frage da es zu selbstverständlich ist. "programm.exe parameter1" DAS HABE ICH ÜBRIGENS OBEN GEZEIGT!!:mad: "

Ja das verstehe ich ja. Nur ich weiss nicht, was die Dosshell ist? Ist das was in Dev-C? Vll. kenn ich die ja, aber der Name sagt mir jetzt nichts!
Ich teste mal deine Funktion, thx!

EDIT:

deine Funktion gibt folgende Fehler aus:

[Warning] address of local variable `output' returned
in Zeile:
char output[10000];
Dann noch:
[Warning] character constant too long for its type
Und zwar da, wo ich Funktion in der Main aufrufe, check mal ob ich das richtig gemacht habe:
x = download('http://mein.ewiglangerlink.de/test/server.php');
 
Zuletzt bearbeitet von einem Moderator:
1.Also bei mir kommen auch die Warnungen. Es sind aber wirklich nur Warnungen und keine Fehler... Man könnte sie eventuel durch kleine Veränderungen im Code entfernen. Ich schau mal.

2.Ja du hast die Funktion richtig aufgerufen.

3. Eine DOS-Shell ist die Eingabeaufforderung. Was DOS ist sollte eigendlich jeder wissen. Eine Shell ist eine Eingabeaufforderung. Ich meinte also die Windows Eingabeaufforderung.

4. Ich habe die char größe auf 10000 gesetzt. Wenn du mit kleinen Werten arbeitest, solltest du sie senken. Eventuel sogar in die Funktioninitialisierung einbauen:
Code:
char* download(char* URL, int laenge)
...
Code:
char* output[laenge];

so zummindest wäre es sinvoller wenn dein Programm den Arbeitsspeicher nicht zu stark belasten soll.

EDIT: Wenn dein String zu lang ist solltest du die Funktionsinitialisierung abändern:
Code:
char* download(char URL[500])
Es ist aber meiner Meinung nach nicht nötig.
 
Zuletzt bearbeitet:
Ja an die Eingabeaufforderung hab ich auch zuerst gedacht, als du sagtest, ich soll Parameter übergeben. Leider hab ich kein Plan von Windows Konsolen und weiss daher net, wie ich was ausführ, naja, ist ja jetzt eh egal! Ich schau mal, ob ich das Programm zum Laufen kriege, Danke für deine anhaltende Mühe!
 
Mhh, vielleicht mach ich den Clienten doch lieber in Java! Kann mir hier vll zufällig jmd sagen, wie ich das in diesem Thread behandelte Problem in Java lösen kann? Kann mir jmd. ein Beispielcode schicken?
 
Mhh, vielleicht mach ich den Clienten doch lieber in Java!
Ne weiße Antwort ;-)

Kann mir jmd. ein Beispielcode schicken?
N'türlich....

Java:
package as;

import java.io.*;
import java.net.*;

/**
 * 
 * @author Yanick Dickbauer
 * @version 1.0
 *
 */
public class Internet
{
    /**
     * Downloads a Web Page from a Web Server
     * @param url The URL String of the Web Site
     * @return The Content String
     * @throws IOException If an IO Error occurres
     */
    public static String downloadPageContent(String url) throws IOException
    {
        URL server = new URL(url);
        
        HttpURLConnection con = (HttpURLConnection)server.openConnection();
        con.connect();
        return readResponse (con.getInputStream());
    }
    
    private static String readResponse (InputStream in) throws IOException
    {
        StringBuilder sb = new StringBuilder();
        byte[] buffer = new byte[BUFFER_SIZE];
        for (;;)
        {
            int anzBytes = in.read(buffer);
            if (anzBytes <= 0)
                break;
            //convert to string
            //aufpassen - der Content kommt im ASCII Zeichensatz
            String cur = new String(buffer, "ASCII");
            sb.append(cur);
        }
        return sb.toString();    
    }
    
    private static final int BUFFER_SIZE = 256;
}

Der Aufruf:

Java:
import java.io.IOException;

public class Test
{
    public static void main( String[] args)
    {
        try {
            System.out.println(Internet.downloadPageContent("http://www.google.at"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

BTW: Es gibt in Java ein super Object vom Typ java.net.HttpURLConnection! Mit diesem Objekt kannst du das HTTP Protokoll echt klasse nützen ohne es selbst implementieren zu müssen!

Lg, Yanick
 
Lumakrieger hat gesagt.:
Okay, ich habe zwischen durch Lebenszeichen eingebaut. Das Ergebnis war, dass das Programm vor der If-else Schleife aufgehört haben muss.

Code:
// letztes Lebenszeichen
if(Buf[0] != '#'){
strcat(befehl[nummer], Buf);
// kein Lebenszeichen mehr
}else{
nummer++;
// kein Lebenszeichen mehr
}

is für mich eigentlich unverständlich warum da ein programm aufhört zu laufen :D
vlt. solltest du mal dein ganzen code schicken, den du grade an dieser stelle hattest... vieleicht hast du ja einfach nur was vergessen?! :)
hab mir zwar den code nicht im detail angeschaut, würde es aber machen wenn du mir deinen postest...
 
Mit Java funktioniert alles nun wunderbar. Und mit C++ gibts nur Probleme. Besonders mit den Datentypen. Deswegen werde ich jetzt doch lieber mit Java weitermachen. Java kann man ja auch zu ner .exe komplilieren oder?
 
> Mit Java funktioniert alles nun wunderbar. Und mit C++ gibts nur Probleme. Besonders mit
> den Datentypen. Deswegen werde ich jetzt doch lieber mit Java weitermachen.

Häh? Welche Probleme mit Datentypen? Wenn Du einen Typ hast den C++ nicht ad hoc bietet, dann bastel ihn Dir selber. C++ ist schließ ansatzeweise Objektorientiert und bietet Dir ne Menge möglichkeiten.

> Java kann
> man ja auch zu ner .exe komplilieren oder?

Kann man. Du kannst den kompilierten Bytecode in einen ExeContainer packen, aber warum? Das ist werder wirklich was Anderes noch hast Du irgendeinen Vorteil. Java wird gerade nicht nativ kompiliert, das was Du willst ist schlichtweg Konzeptwidersprechend.

Navy
 

Neue Beiträge

Zurück