Funktion von cout in printf



  • Hallo,

    ich hab ein kleines Problem. Ich habe ein wenig Code, der die IP-Adresse
    zu einer angegebenen URL ausgiebt. Allerdings ist die exe 460kB groß! Das
    dürfte durch den iostream Header kommen. Vielleicht kann mir jemand sagen,
    wie ich die cout Funktion die die IP-Adresse in der xxx.xxx.xxx.xxx. Form ausgibt in eine
    printf Funktion die das selbe ausgiebt umwandlen kann.

    Hier mein Code:

    #include <winsock.h>
    #include <exception>
    #include <iostream.h>
    
    using namespace std;
    
    class WindowsSocketInit
    {
        public:
            WindowsSocketInit()
            {
                if ( !Init() )
                    throw exception();
            }
    
            ~WindowsSocketInit()
            {
                bool bOk = WSACleanup() != 0;
            }
    
        private:
            bool Init()
            {
                WSADATA wsa;
                return WSAStartup( MAKEWORD( 2, 2 ), &wsa ) == 0;
            }
    };
    
    int main(int argc,char* argv[])
    {
            WindowsSocketInit socketInit;
    
            struct hostent* host = 0;
            for ( int i = 1; i < argc; ++i )
            {
                // den Servernamen aufloesen
                host = gethostbyname(argv[i]);
                    // die IP-Adresse ausgeben
                    in_addr* ia = (struct in_addr*)host->h_addr;
                    cout << "\tip: " << inet_ntoa(*ia) << endl;
            }        
    return 0;
    }
    


  • Dir ist schon bewußt, dass das C++ ist? 🙄

    [Edit]Und deine Frage versteh ich auch nicht bzw. hab sie noch nicht gefunden.[/Edit]



  • Die Anweisung lautet:

    printf("\tip: %s", inet_ntoa(*ia));
    

    Aber wenn du die Größe der ausführbaren Datei verkleinern möchtest, dann such
    besser nach entsprechenden Compilereinstellungen. Zusätzlichen Code aus der
    C runtime zu verwenden, dürfte deine Datei eher noch grösser machen.

    Zum Vergleich:
    Bei meinem System (VC6) ist dein Programm im Debug-Build ~200K, und im Release-Build
    ~48K gross. Welchen Compiler verwendest du?



  • das versuch ich mal

    ihm ist bewusst das c++

    er will die iostream raus haben und stattdessen printf benutzen
    ( dann muss er aber stdio.h includen )

    und frägt wie man die zeile

    cout << "\tip: " << inet_ntoa(*ia) << endl;
    

    in ein printf umwandeln.

    in der art

    char *ch = inet_ntoa(*ia);
       printf("\ttip : %c\n", ch);
    // ka ob das so gehen wird
    

    dazu muss er in ein char pointer den rückgabewert von inet_ntoa(*ia) "reinladen" und dann mit printf ausgeben.

    naja er könnt aber auch mal statt debug version (unterstelle ich mal jetzt so ) die release erstellen und sehen ob immer noch 460kb gross 😉 ( aber das nur so mal am rande )



  • mist zu langsam 😞



  • Hallo,

    danke erstmal für die schnellen Antworten. Ich benutze den Dev-C++ Compiler,
    weiß allerdings nicht wo ich die Debug in eine Release exe umstellen kann.
    Optimierungen beim compilieren hatte ich schon angeschaltet. Allerdings
    sind meine exe-Dateien wenn ich den iostream-Header nicht benutze auch nur
    um die 40kB groß.

    Und super, der Tip von 24x7_coder funktioniert. Vielen Dank! 🙂

    Kann ich die IP-Adresse in der xxx.xxx.xxx.xxx Form auch in einen Speicher
    schreiben?

    Danke nochmal

    yogle



  • Ich benutze den Dev-C++ Compiler,
    weiß allerdings nicht wo ich die Debug in eine Release exe umstellen kann.
    Optimierungen beim compilieren hatte ich schon angeschaltet.

    Weiss ich leider auch nicht, ich kenne den Dev-C++ Compiler nur dem Namen
    nach. Aber ehrlich gesagt würde ich mir zu diesem Zeitpunkt keine grossen
    Gedanken um Optimierungen machen. Solltest du mal Programme schreiben, bei
    denen das wichtig wird, wirst du vermutlich nicht mehr mit Dev-C++ arbeiten.

    Kann ich die IP-Adresse in der xxx.xxx.xxx.xxx Form auch in einen Speicher
    schreiben?

    Sicher. Etwa so:

    char ip[16];
    strcpy(ip, inet_ntoa(*ia));
    

    ..wenn man mal alle Fehlermöglichkeiten großzügig unbeachtet läßt.



  • Hallo,

    ja ich glaube die Fehler treten auf. Wenn ich nämlich darunter die Funktion zur Kontrolle schreibe,
    kommt nur Schwachsinn wie 50 oder solche Sachen raus. 😮

    char ip[16];
    strcpy(ip, inet_ntoa(*ia));
    printf ("\tip: %c", ip);
    

    Auch %s oder so etwas nützt nichts.
    Was kann man dagegen tun?

    yogle



  • Ich kann deinen Fehler nicht reproduzieren. Poste nochmal deine geändertes
    Programm (oder die main()-Funktion, sofern der Rest unverändert ist).



  • Ich möchte kontrollieren ob für den char ip wirklich genau xxx.xxx.xxx.xxx
    abgespeichert wurde. Das wollte ich durch eine zweite Ausgabe der IP tun.

    int main(int argc,char* argv[])
    {
            WindowsSocketInit socketInit;
    
            struct hostent* host = 0;
            for ( int i = 1; i < argc; ++i )
            {
                // den Servernamen aufloesen
                host = gethostbyname(argv[i]);
                    // die IP-Adresse ausgeben
                    in_addr* ia = (struct in_addr*)host->h_addr;
                    printf("\tip: %s", inet_ntoa(*ia));
    
                    char ip[16];
                    strcpy(ip, inet_ntoa(*ia));
                    printf ("\n\nip: %c", ip);
            }
    
    return 0;
    }
    

    Allerdings funtkioniert es mal wieder nicht. 😞 Ich will halt die IP-Adresse
    in einer Variablen speichern, so dass ich später damit weiterarbeiten kann.
    Z.B. zum verbinden über sockets zu dieser IP. 🙂

    yogle



  • Ausser, dass es "%s" - nicht "%c" - heissen sollte, sehe ich kein Problem.
    Es sei denn, deine IP-Adresse ist länger als 15 bytes. In dem Fall mach halt
    das char-Array grösser.



  • Hallo,

    stimmt ich muss mich irgendwo verschrieben haben.
    Funktioniert jetzt super! 😃
    Vielen Dank für die hilfreichen und schnellen Antworten! 🙂

    yogle


Anmelden zum Antworten