IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

APi Win32 GetFileSizeEx


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 17
    Points
    17
    Par défaut APi Win32 GetFileSizeEx
    Bonjour à tous,

    Je découvre totalement la programmation avec l'API Win32.
    J'avais auparavant posté dans une autre catégorie et il est ressorti qu'il fallait que j'utilise l'API Windows pour résoudre mes problèmes (adressage et positionnement d'un pointeur dans des fichiers pouvant excèder 4 Go).

    Ne conaissant que très peu l'API, je doit omettre quelquechose car je ne parviens pas à compiler.
    De plus je ne sais pas comment lier une librairie, ce n'est pas très clair pour moi.

    Voici le code qui pose problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include <cstdlib>
    #include <iostream>
    #include <Windows.h>
    #include <WinBase.h>
    
    using namespace std;
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
    {
    HANDLE monfichier=CreateFile("C:\\Users\\Aurelien\\Documents\\Progra\\fich\\test.txt",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
    //HANDLE hfic=CreateFile(fichier,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
    char tab[2] = "A";
    string texte = "montexte";
    SetFilePointer(monfichier, 0, NULL, FILE_END);
    WriteFile(monfichier,&texte,sizeof(texte),NULL,NULL);
    
       LARGE_INTEGER t;
       BOOL taille=GetFileSizeEx(monfichier,&t);
    
        //sprintf(tab, "taille égale %d",taille);
        if(monfichier==INVALID_HANDLE_VALUE){
            MessageBox(NULL,tab,"erreur",MB_OK| MB_ICONEXCLAMATION);
        }
        return 0;
    }
    La compilation bloque à la ligne de GetFileSizeEx.
    J'ai ajouté dans l'éditeur de lien "libkernel32.a" présent dans le repertoire lib de DevC++.
    Dois-je linker des DLL? Sont elles chargées automatiquement? Les librairies ne sont elles pas présentes sous Windows?

    J'ai lu sur le site qu'il fallait un SDK, mais je ne comprends pas pourquoi étant donné que l'API fait parti de Windows, de plus le lien était pour Windows Server 2003.

    Si quelqu'un peut m'expliquer ce qui ne va pas et comment je dois procéder car j'ai beau chercher je ne comprends pas vraiment.
    Merci

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Citation Envoyé par devdebutantajax Voir le message
    Je découvre totalement la programmation avec l'API Win32.
    Bienvenue au club, tu verras, au début, cela pique les yeux mais après, c'est super.

    Citation Envoyé par devdebutantajax Voir le message
    La compilation bloque à la ligne de GetFileSizeEx.
    Quel est le message d'erreur (complet s'il te plait) ?

    Citation Envoyé par devdebutantajax Voir le message
    J'ai ajouté dans l'éditeur de lien "libkernel32.a"
    Non, tu n'est pas sous unix. Si tu devais te linker avec une librairie, l'extension serait surement .lib

    Citation Envoyé par devdebutantajax Voir le message
    Dois-je linker des DLL?
    Non, une DLL est du code chargée au moment de l'exécution du programme. Tu n'a jamais besoin des DLL lors de la compilation ni du link. Par contre, tu as besoin des librairies (.lib) qui permettent d'utiliser ces DLL. Dans ton cas, cette librairie, c'est kernel32.lib. Je ne connais pas ton environnement de développement mais souvent, le link avec cette librairie est par défaut donc tu n'as pas besoin de le spécifier.

    Citation Envoyé par devdebutantajax Voir le message
    Sont elles chargées automatiquement?
    Oui, c'est le rôle du loader de programme. Dans certains cas très spécifiques, elles peuvent être chargées et déchargées à la demande mais tu n'en est pas encore là.

    Il faut tester le retour de tes fonctions (SetFilePointer() par exemple). C'est pas grave dans ce cas présent mais c'est une bonne habitude à prendre

    L'utilisation de la fonction WriteFile n'est pas correcte.
    • Le 2eme paramètre est un pointeur (void *) de la zone mémoire qu'il faut écrire. Ici, tu passes l'adresse d'un objet std::string. Cela n'a rien à voir.
    • Le 3eme paramètre est l'adresse d'un DWORD pour indiquer en retour le nombre d'octets écrits. Il ne peut être NULL que dans un seul cas, les écritures Overlapped (concept avancé), donc dans ton cas, il faut passer l'adresse d'une valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char *txt = "montexte";
    DWORD nb_write;
       if(WriteFile(monfichier, txt, strlen(txt), &nb_write, NULL) == FALSE)
       {
          MessageBox(NULL, tab, "erreur", MB_OK | MB_ICONEXCLAMATION);
       }
    ou encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DWORD nb_write;
       if(WriteFile(monfichier, "montexte", strlen("montexte"), &nb_write, NULL) == FALSE)
       {
          MessageBox(NULL, tab, "erreur", MB_OK | MB_ICONEXCLAMATION);
       }
    Le test que tu fais en fin de main (if(monfichier==INVALID_HANDLE_VALUE)...), il serait mieux juste apès l'ouverture du fichier.

    Sinon, à part cela, le programme est bon et le résultat obtenu est correct

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    Franchement je tiens déjà à te remercier pour le temps que tu passes à m'aider.

    Alors pour le code j'ai mis un peu en vrac les tests c'était pour déterminer d'où pouvait venir l'erreur.
    Cette erreur justement: 22 C:\Users\Aurelien\Documents\Progra\fich\main.cpp `GetFileSizeEx' undeclared (first use this function).

    Pourtant j'ai regardé dans le linker j'ai bien le chemin vers devCpp/include pour les fichier ".h".
    J'ai cherché depuis que j'ai posté sur le forum, et je ne parviens toujours pas à trouver le problème avec cette fonction. J'ai installé le fameux SDK, j'ai rajouté les liens vers celui-ci, mais rien n'y fait. windows.h est bien présent dans le rep include de DevCpp (idem pour winbase.h)

    J'ai aussi essayé sous Microsoft Visual C++ 2005 et cette fois j'ai fatal error C1083: Impossible d'ouvrir le fichier include*: 'Windows.h'*: No such file or directory. J'ai essayé de rajouter un lien dans le linker mais je n'ai pas réussi dans propriétés du projets et "editeur de liens" je ne trouve rien pour ajouter un chemin.
    EDIT: Je suis parvenu à jouter le chemin du SDK (repertoire include) dans ajouter une bibliothèque supplémentaire dans propriétés projet -> editeur de lien -> général -> Repertoires de bibliothèque supplémentaire; Mais toujours la même erreur.

    Merci encore

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    En tout premier dans ton code avant les include, ajoute pour voir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifndef _WIN32_WINNT		// Autorise l'utilisation des fonctionnalités spécifiques à Windows*XP ou version ultérieure.                   
    #define _WIN32_WINNT 0x0501	// Attribuez la valeur appropriée à cet élément pour cibler d'autres versions de Windows.
    #endif
    Si cela marche, dis le et je t'explique après.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 17
    Points
    17
    Par défaut
    Alors ça compile sous DevC++ mais pas sous Visual Express, mais bon c'est pas très grave à la limite.

    Oui je veux bien que tu m'expliques ce qui a semble-t-il résolu le problème.

    J'ai regardé quelques codes sources programmé avec l'API est j'avoue que je vois beaucoup de code pour déclarer diverses "choses" mais je ne saisi vraiment pas. L'apprentissage risque d'être compliqué, mais si ça vaut la peine alors je passerais par là.

    Merci à toi

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Je pense que tu as un problème dans l'ordre de tes répertoires include.
    Il faut que tu aies en premier le répertoire des include du SDK puis en 2eme ceux livrés par ton compilateur.

    Dans mon cas, cela donne:
    • C:\Program Files\Microsoft Platform SDK\Include
    • C:\Program Files\Microsoft Visual Studio 8\VC\include
    • C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\include
    • C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\include
    • C:\Program Files\Microsoft DirectX SDK (April 2007)\Include
    • C:\Program Files\boost\include\boost-1_33_1

    C'est la même chose pour les libraries. Il y a un ordre dans les répertoires de recherche et il faut mettre le même que pour les include (le répertoire des librairies du SDK avant le répertoire des librairies de ton compilateur)

    Les includes livrés avec ton compilateurs ne sont pas forcemment les derniers. L'install du SDK permet d'avoir les dernière librairies ainsi que les derniers include files. C'est pour cela que l'ordre est très important.

    Je suppose que dans ton cas, le fichier winbase.h que tu utilises est celui délivré avec ton compilateur et que dedans, il doit y avoir quequchose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #if(_WIN32_WINNT >= 0x0400)
    WINBASEAPI
    BOOL
    WINAPI
    GetFileSizeEx(
        __in  HANDLE hFile,
        __out PLARGE_INTEGER lpFileSize
        );
    #endif // #if (_WIN32_WINNT >= 0x0400)
    et comme tu ne définissait pas _WIN32_WINNT (ce que je t'ai fait rajouter), la fonction GetFileSizeEx() n'était pas déclarée.

    La déclaration de la constante _WIN32_WINNT permet de gérer les fonction qui existe dans certaine version et pas dans d'autres.

    Je pense aussi que si tu utilises les includes du SDK en premier, ce problème disparait.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 17
    Points
    17
    Par défaut
    Merci pour tes explications claires.

    Dans Visual C++ je n'ai pas trouvé d'ordres j'ai juste pu spécifier une bibliothèque supplémentaire, mais ce n'est pas très important je suis sous DevC++ et cela fonctionne.

    Tes explications finales avec le code m'ont aidé à bien comprendre le problème et je t'en remercie. J'ai encore beaucoup à apprendre...

    Merci beaucoup sincèrement,

    Je pense que tu me verras encore quelques fois, étant donné que je risque d'être confronté à de nouveaux problèmes. Mais maintenant que je peux compiler je vais bien regarder la doc MSDN, les codes source que j'ai et des tutos pour bien tout assimiler.

    Merci et à bientôt

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 593
    Points
    41 593
    Par défaut
    Déjà, si tu as Visual Express, as-tu pris aussi le Platform SDK ? Il doit être téléchargé séparément...

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 258
    Points : 12 471
    Points
    12 471
    Par défaut
    il semble que devdebutantajax confonde fichier d'en-tête et .lib, include et bibliothèque, compilation et linking.
    En C++, pour générer un exécutable, il y a plusieurs phases.

    - Pre-processing ou on utilise les fichiers d'en-tête (.h), c'est la configuration des répertoires d'include qui est utilisée.

    - Compilation des sources

    - Linking du code généré avec les bibliothèques, (.lib), c'est la configuration des répertoires des "librairies" qui est utilisée.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 17
    Points
    17
    Par défaut
    Bonjour à tous, merci pour vos messages.
    bacelar -> effectivement je confonds encore un petit peu ces notions.

    Alors je reviens vous voir puisque j'ai tenté de transformer mon code pour utiliser l'API Win32, mais j'obtiens un "le programme a cessé de fonctionner". Je pense avoir identifié le morceau de code qui plante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    bool DecoupeFichier(HANDLE f, long long int emplacement, int decoupe, void* mem)
    {
        LPDWORD bloc_lu;
        LARGE_INTEGER empl; // Structure qui permet de stocker la valeur de déplacement
        empl.QuadPart=emplacement;
        if(f==INVALID_HANDLE_VALUE) // Test si le handle est valide
        {
            return false;
        }else{
            SetFilePointerEx(f, empl, NULL, FILE_BEGIN); // Se positionne à l'emplacement fournit en 2ieme parametre à la fonction
            BOOL lecture_ok = ReadFile(f,mem,decoupe,bloc_lu,NULL); // Lit depuis f et stocke dans mem la taille spécifiée dans decoupe si possible
            if(lecture_ok){
                return true;
            }else{
                return false;
            }
        }
    }
    Maintenant le code appelant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char file_name[300] = "C:\\Users\\Aurelien\\Documents\\future.exe";
        HANDLE monfichier=CreateFile(file_name,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL); //Ouverture du fichier uniquement si il existe, en lecture, et partage en lecture
    int decoupage = 10000;
    if(DecoupeFichier(monfichier, 0, decoupage, memoire)){
                printf("\ndecoupage OK\n");
            }else{
                printf("\npb de découpage\n");
            }
    Est ce que vous voyez quelquechose qui cloche. A noter qu'avec DevC++ quand je clique sur ReadFile il me met les arguments à rentrer et cela diffère de ce qui est donné sur MSDN...

    Merci à tous.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    Je pense avoir identifié le problème qui devait être le LPWORD au lieu de WORD pour bloc_lu.

    Cependant j'ai un problème que je n'avais pas prévu (que c'est étonnant).
    J'ai créé des "long long int", quand je fais un sizeof() de ces variables j'obtiens bien une taille de 8 octets, pourtant quand j'essaie d'attribuer une valeur supérieur a 2Go j'ai le problème suivant:
    210 C:\Users\Aurelien\Documents\Progra\client\main.cpp integer constant is too large for "long" type

    J'en suis revenu au problème du 32 bits. Je comprends vraiment pas la.
    J'ai aussi essayé avec int64_t, mais rien à faire. Je suis sous DevC++

  12. #12
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    le petit bout de code qui produit l'erreur s'il te plait ?

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 17
    Points
    17
    Par défaut
    Bonsoir,

    Ouf merci, je recherche depuis tout à l'heure mais pas de solution.

    Voici le code qui pose problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long long test = 10009997776;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long long int test = 10009997776;
    Et en ajoutant d'autre option au compilateur j'obtiens ISO C++ does not support `long long'. Mais c'est une erreur pas un Warning...

    Merci

  14. #14
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Bizarre, cela passe sans problème sur mon compilateur (VS2005 + warning niveau 4)

    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long long int test = 10009997776LL;
    pour dire que ta constante est de type long long (sans garantie mais si cela ne sert à rien, en tout cas, cela ne génère pas d'erreur chez moi)

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 17
    Points
    17
    Par défaut
    Si je rajoute LL à la fin cela fonctionne, mais les 3/4 de mes fonctions retournent des long long int (manipulation de fichiers qui peuvent être lourds), je ne vais pas pouvoir rajouter LL à la fin de tous mes long long int, en plus je m'en sers dans des boucles for donc les LL vont être interprétés je ne sais pas comment...
    Je ne comprends pas trop à vrai dire. Merci pour ton aide

  16. #16
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Le problème que tu avais est un problème du compilateur qui te previent que la CONSTANTE que tu assignes est trop grande pour est mise dans un int. En ajoutant le LL à la fin, tu le prévient que tu sais et tu lui demandes de pas te gonfler (c'est comme cela que je l'interprete).

    Maintenant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(long long int boucle = 0; boucle != 1000; boucle++)
    cela doit passer sans warning.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    long long int ma_fct_qui_retourne_un_long_long(void)
    {
       //return 1000;
       return 10009997776LL;
    }
    
    long long int ret = ma_fct_qui_retourne_un_long_long();
    Cela devrait passer aussi

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    Merci pour ces infos.
    J'ai essayé diverses choses hier soir. En fait il semble qu'il faille rajouter LL à la fin car comme tu le dis pour le compilateur un nombre sans virgule sera un int, et la il dépasse la taille donc on le force avec LL.

    Par contre ma fonction qui récupère la taille d'un fichier retourne un long long int sans problème je n'ai pas a demander de rajouter LL à la fin de la variable.

    Je pense donc que ceci doit être fait uniquement quand on cherche à assigner nous même une valeur. En tout cas merci, tout ceci avance petit à petit, je découvre l'API

    Bonne journée

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 17
    Points
    17
    Par défaut
    Bonjour à tous,

    Je suis confronté à un nouveau problème, et puis j'ai une petite question.
    Alors la première:
    Avec un cin>>variable, si on a un espace tout ce qui se trouve après n'est pas pris en compte ou le sera lors du prochain cin. De ce fait je souhaite utiliser la fonction cin.getline qui me permet en même temps de spécifier la taille max et d'éviter un débordement du tableau.

    Voici donc mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char nom_fichier[200];
    cin.getline(nom_fichier,200);
    cout<<nom_fichier<<endl;
    Malheureusement le programme n'attends pas que je tape quoi que ce soit et passe directement au cout...
    Avez vous une idée pour résoudre le problème, car j'ai regardé sur de nombreux sites et ma syntaxe est correcte.

    EDIT: J'ai fini par trouver c'était une histoire de carriage return qui trainait dans cin. Du coup je vais mettre ce qu'il faut faire si quelqu'un tombe sur ce post plus tard:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // flush() : Vide le buffer de saisie
    inline void flush()
    {
    	// Remettre le buffer à zero
    	cin.clear();
    	// Clear ne marchera pas seul:
    	// Ignorer tous les caractères du buffer 
    	// jusqu'au caractère 'Nouvelle ligne' compris
    	cin.ignore(INT_MAX, '\n');
    }
    A faire avant d'appeler cin.getline(...).


    L'autre question concerne les sockets. Plus précisément le débit instantané des sockets. Existe-t-il une fonction qui permet de retourne le débit en octets par secondes pour une socket donnée? (je n'ai pas trouvé sur MSDN).
    Dois je plutôt regarder le nombre de paquets envoyé avec une fonction timer? D'ailleurs je ne saurais pas faire ça, mais je trouverais peut être.

    Merci pour vos conseils avisés.

  19. #19
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    En ce qui concerne les stats sur un socket particulier, je ne connais pas de fonctions mais tu as GetIpStatistics() qui retourne de stats sur la connexion au niveau IP (regarde aussi les autres fonctions dans IpHelper).

    Sinon, pour faire des stats au niveau de ton socket, tu comptabilises les entrées, les sorties, la date d'ouverture du socket et avec un timer, tu peux calculer à peu près la bande passante sur ton socket.

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 48
    Points : 17
    Points
    17
    Par défaut
    Rebonjour,

    Merci pour ta réponse.
    Je vais regarder les fonctions dont tu m'as parlé, cela pourra toujours servir si je veux faire des statistiques plus globales.

    Ensuite je reviens pour la fonction précédente.
    Ma solution est bancale. Une fois sur deux cela ne fonctionne pas...
    C'est à dire que une fois cela n'attends pas que je saisisse quelquechose (surement un /n qui traine quelque part) et une autre fois je saisie du texte ENTER et je dois réécrire et ENTRER de nouveau, mais uniquement la deuxième partie est conservée...

    Je ne cerne pas le problème ce qui me gêne un petit peu.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant]Quelques questions de principe sur l'API win32
    Par silver_dragoon dans le forum Windows
    Réponses: 4
    Dernier message: 19/03/2004, 19h38
  2. [API WIN32] Pb avec SHGetSpecialFolderLocation
    Par Invité dans le forum MFC
    Réponses: 3
    Dernier message: 27/01/2004, 22h19
  3. [API Win32] WriteFile()
    Par tut dans le forum MFC
    Réponses: 2
    Dernier message: 27/01/2004, 17h13
  4. API Win32
    Par benoit70 dans le forum MFC
    Réponses: 8
    Dernier message: 26/01/2004, 20h11
  5. [API win32] Récupérer le répertoire d'un profile
    Par sbeu dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 27/09/2002, 13h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo