Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pourqui mon programme marche t'il a 2 à l'heure

et pourquoi est-il si imprecis

Sujet résolu
    29 avril 2006 à 14:12:16

    Bonjour, j'ai recement codé ce programme :
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define WINDOWS

    int main()
    {
        char filename1[401], filename2[401];
        FILE *file1 = NULL, *file2 = NULL;
        int test, test2,len1;
        double len = 0, position, percentage;
        printf("enter the name and the path of the file you want to copy from : ");
        fgets(filename1, sizeof(filename1), stdin);
        printf("enter the name and the path of the file you want to copy to : ");
        fgets(filename2, sizeof(filename2), stdin);
        len1 = strlen(filename1);
        filename1[len1-1]='\0';
        len1 = strlen(filename2);
        filename2[len1-1]='\0';
        file1 = fopen(filename1, "r");
        rewind(file1);
        file2 = fopen(filename2, "w");
        if (file1 != NULL && file2 != NULL)
        {
            while (test != EOF)
            {
                test = fgetc(file1);
                printf("%ld\n",len1);
                len1++;
            }
            len = len1;
            getch();
            rewind(file1);
            test = fgetc(file1);
            while (test != EOF)
            {
                #ifdef WINDOWS
                system("cls");
                #endif
                #ifdef UNIX
                clear();
                #endif
                position = ftell(file1);
                percentage = position / len * 100;
                printf("%3.1lf percent done", percentage);
                fputc(test, file2);
                test = fgetc(file1);
            }
            printf("\nSUCCESS !!!\n");
            getch();
        }
        else
        {
            printf("Error : could not open one of the files.\n");
            if (file1!=NULL)
                fclose(file1);
            if (file2!=NULL)
                fclose(file2);
            getchar();
            exit(EXIT_FAILURE);
        }
        return EXIT_SUCCESS;
    }


    qui demande un fichier a copier, une destination de copie et copie le fichier, tout ce passait bien et rapidement jusqu'a ce que j'ajoute une gestion des poucentages, et la deux problemes :
    1/ Le programme est mille fois plus lent : il lui faut 35 secondes pour copier un txt de...254 octets( :lol: )
    2/ Le systeme de pourcentage est ultra imprecis, je finis de copier mon fichier alors que le pourcentage "est" compris entre 94.5 et 97 (et oui, pour le meme fichier, le pourcentage n'avance pas de la meme facon (ce qui, vu la methode que j'utilise pour le pourcentage est totalement impossible)

    PS : vous remarquerez que a chaque fois que vous lancerez le programme, la valeur 'len1' sera differente, pour mon fichier elle est toujours dans les alentours de 256-265 (au lieu de 254) cela explique le pobleme de pourcentage, meme si ne sais toujours pas le regler.

    merci d'avance pour votre aide.
    • Partager sur Facebook
    • Partager sur Twitter
      29 avril 2006 à 14:15:17

      Tu devrais plutôt faire ça avec fread fwrite à mon avis.
      • Partager sur Facebook
      • Partager sur Twitter
        29 avril 2006 à 14:34:23

        Citation : Kr00pS

        Tu devrais plutôt faire ça avec fread fwrite à mon avis.


        ma seule reference en c actuellement est le tuto du sdz (j'ai le K&R mais depuis pas longtemps alors je m'y retrouve pas encore (mon projet a d'ailleur ete choisi car l'un des premier chapitre du K&R propose de faire des trucs de ce style)) et le tuto du sdz ne parle pas de fread ni de fwrite, par consequent je ne sais pas comment ils fonctionnent, mais je pense qu'ils sont faits pour ecrire et lire des chaines de caracteres, hors si je veut pouvoir gerer les fichiers de toutes tailles je doit operer caractere par caractere.
        Je pense de toute facon que cela est du au calcul du pourcentage car avant que je le mette, le programme etait aussi (voir plus) rapide que l'utilitaire de copier/coller de windows.
        • Partager sur Facebook
        • Partager sur Twitter
          29 avril 2006 à 14:39:48

          FREAD size_t fread (void* adr, size_t taille, size_tn blocs, FILE* flux);
          Lit, sur le flux spécifié, au maximum nblocs de taille octets chacun et les range à l'adresse adr. Fournit le nombre de blocs réellement lus.

          FWRITE size_t fread (const void* adr, size_t taille, size_tn blocs, FILE* flux);
          Ecrit, sur le flux spécifié, nblocs de taille octets chacun, à partir l'adresse adr. Fournit le nombre de blocs réellement écrits.
          • Partager sur Facebook
          • Partager sur Twitter
            29 avril 2006 à 14:59:20

            merci beaucoup
            est ce que l'utilisation de ses fonctions peut optimiser mon code (en vitesse) ?
            y a il des moyens de l'accelerer en optimisant le calcul du pourcentage ?

            PS : c'est vraiment grave là : en plus d'etre tres lent le programme ralentit carrement mon pc (et beaucoup en plus)

            rePS : 1ere optimisation : les double sont maintenant des float (oui je sait sa sert a rien)

            rerePS : plus besoin de s'occuper du probleme de precision : je l'ai reglé
            • Partager sur Facebook
            • Partager sur Twitter
              29 avril 2006 à 17:51:15

              Citation : Koral

              Bonjour, j'ai recement codé ce programme :


              • getch() n'est pas défini
              • la copie doit se faire en mode bimaire
              • la méthode n'effacement est la pire qui soit... Utiliser \r...
              • Il n'y a pas de contrôle de l'ouverture des fichiers
              • La méthode de nettoyage de la saisie est peu sûre (et si le \n n'est pas présent ?)
              • Certains nom de variables sont sans signification...
              • Ta méthode de calcul est horriblement complexe... Il suffit de compter, utiliser un modulo...

              Voici un recodage de ton code. Pose des questions si tu ne comprends pas.

              #include <stdio.h>
              #include <stdlib.h>
              #include <string.h>

              #define DBG 1

              static void clean (char *s, FILE *fp)
              {
                 /* search ... */
                 char *p = strchr (s, '\n');
                 if (p != NULL)
                 {
                    /* ... and kill */
                    *p = 0;
                 }
                 else
                 {
                    /* purge */
                    int c;
                    while ((c = fgetc(fp)) != '\n' && c != EOF)
                    {
                    }
                 }
              }

              int main(void)
              {
                 int ret = EXIT_FAILURE;
                 char fname_from[MAX_PATH];

                 printf("enter the name and the path of the file you want to copy from : ");
                 fgets(fname_from, sizeof(fname_from), stdin);
                 clean(fname_from, stdin);

                 {
                    FILE *fp_from = fopen(fname_from, "rb");
                    if (fp_from != NULL)
                    {
                       char fname_to[MAX_PATH];
                       printf("enter the name and the path of the file you want to copy to : ");
                       fgets(fname_to, sizeof(fname_to), stdin);
                       clean(fname_to, stdin);
                       {
                          FILE *fp_to = fopen(fname_to, "wb");
                          if (fp_to != NULL)
                          {
                             /* count the file size */
                             unsigned long size = 0;
                             while (fgetc (fp_from) != EOF)
                             {
                                size++;
                             }
                             rewind(fp_from);
                             printf ("%lu bytes to be copied\n", size);
                             {
                                /* number of bytes for 1% */
                                unsigned long const k = size > 100 ? size / 100 : 1;

                                /* bytes count */
                                unsigned long i = 0;

                                /* percentage progression */
                                int pcent = 0;

                                /* copy */
                                int c;
              #if DBG
                                printf("k = %lu byte%s per %% (about)\n", k, k > 1 ? "s" : "");
              #endif

                                while ((c = fgetc (fp_from)) != EOF)
                                {
                                   fputc(c, fp_to);

                                   /* percentage progression display */
                                   i++;
                                   if (i % k == 0 && pcent < 99)
                                   {
                                      pcent++;
                                      printf ("\r%3d%%", pcent);
                                      fflush (stdout);
                                   }
                                }
                                /* last (must be 100%) */
                                printf ("\r%3d%%\n", pcent + 1);
                                ret = EXIT_SUCCESS;
                             }
                             fclose (fp_to), fp_to = NULL;
                          }
                       }
                       fclose (fp_from), fp_from = NULL;
                    }
                    else
                    {
                       perror (fname_from);
                    }
                 }
                 return ret;
              }
              • Partager sur Facebook
              • Partager sur Twitter
              Music only !
                29 avril 2006 à 23:02:49

                Merci beaucoup !!!

                Citation : -ed-

                Ta méthode de calcul est horriblement complexe... Il suffit de compter, utiliser un modulo...


                c'est vrai, j'avais pensé apres coup a utiliser un modulo etc. mais je n'avais pas reussis a mettre sa en place (une operation mathematique brute est plus facile a mettre en place pour le pauvre humain que je suis, meme si elle est finalement compliqué)

                Citation : -ed-

                getch() n'est pas défini


                c'est a dire ?

                En tout cas merci beaucoup, je n'ai pas encore analysé le code dans les details mais je n'ai rencontré aucun probleme quand je l'ai lu.
                • Partager sur Facebook
                • Partager sur Twitter
                  29 avril 2006 à 23:13:08

                  Pour les maths, je ne peux pas te répondre, je suis vraiment une grosse brêle dans cette matière. (8 au brevet blanc de maths, c'est pour te dire la quiche que je suis :-° )

                  Sinon pour getch(), c'est très simple, elle se trouve dans conio.h donc met l'include ;)

                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 avril 2006 à 23:25:59

                    Citation : Kr00pS

                    8 au brevet blanc de maths, c'est pour te dire la quiche que je suis :-°


                    lol 27 au brevet blanc et 36 au vrai brevet...

                    Citation : Kr00pS

                    Sinon pour getch(), c'est très simple, elle se trouve dans conio.h donc met l'include ;)


                    bizarre, sa marchait chez moi...(peut etre que sa ne marche que sous windows sans mettre l'include...)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 avril 2006 à 23:27:31

                      Citation : Koral

                      Citation : Kr00pS

                      8 au brevet blanc de maths, c'est pour te dire la quiche que je suis :-°


                      lol 27 au brevet blanc et 36 au vrai brevet...



                      Non 8/20 quand même ^^

                      Citation : Koral

                      Citation : Kr00pS
                      Sinon pour getch(), c'est très simple, elle se trouve dans conio.h donc met l'include ;)

                      bizarre, sa marchait chez moi...(peut etre que sa ne marche que sous windows sans mettre l'include...)


                      Normal ça marche, c'est juste un warning mais c'est important quand même.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        30 avril 2006 à 9:11:16

                        Citation : Kr00pS

                        Non 8/20 quand même ^^


                        c'est deja mieux :D , mais c'est quand meme plus bas que mais note de francais et d'H/G (bon en H/G c'etait un accident, mais en francais je suis vraiment nul)

                        Citation : Kr00pS

                        Normal ça marche, c'est juste un warning mais c'est important quand même.


                        Ok merci de ton explication.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 mai 2006 à 19:15:39

                          Citation : -ed-

                          Voici un recodage de ton code. Pose des questions si tu ne comprends pas.


                          Tu utilise beaucoup de fonctionnalités qui m'etait inconnues mais je les comprend, cependant, je n'ai toujours pas compris le fonctionnement de la fonction
                          static void clean (char *s, FILE *fp)

                          et je ne comprend pas ce que signifie le "static" devant le "void" et ce que cela apporte.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 mai 2006 à 19:39:58

                            Citation : Koral

                            je n'ai toujours pas compris le fonctionnement de la fonction

                            static void clean (char *s, FILE *fp)



                            (je dois partir, j'y reviendrais plus tard... fais un up vers 22:30, mais déjà expliqué plusieurs fois sur le forum...)

                            Citation : Koral


                            et je ne comprend pas ce que signifie le "static" devant le "void" et ce que cela apporte.


                            static signifie que la portée de la fonction est limitée au fichier source courant. J'ai l'habitude de travailler sur du code de plusieurs millions de lignes répartis dans des milliers de fichiers... Je cherche donc à reduire la portée des fonctions qui n'ont pas à être exportées. J'applique ce principe dans tous mes codes y compris les plus petits (un fichier : seul main() est exportée...)

                            http://mapage.noos.fr/emdel/notes.htm#portee

                            void signifie que la fonction ne retourne rien.
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Music only !
                              4 mai 2006 à 20:24:51

                              La fonction de -ed- fait trois choses :
                              * Elle cherche le caractère de retour à la ligne (\n) que fgets met quand il le peut si il y est tout c'est bien déroulé et elle le vire, sinon elle vide le buffer avec la fonction fgetc tant qu'elle ne "mange" pas le caractère \n et tant que c ne vaut pas EOF.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                5 mai 2006 à 0:54:01

                                Citation : Kr00pS

                                La fonction de -ed- fait deux trois choses :
                                * Elle cherche le caractère de retour à la ligne (\n) que fgets met quand il le peut si il y est tout c'est bien déroulé et elle le vire, sinon elle vide le buffer avec la fonction fgetc tant qu'elle ne "mange" pas le caractère \n et tant que c ne vaut pas EOF (End Of File).

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Music only !
                                  14 mai 2006 à 23:03:32

                                  Bon allez, une derniere question : que fait le '\r' exactemment ? Parce que dans les docs soit je ne trouve rien dessus soit on m'indique qu'il fait un "carriage return" (retour charriot ???), je n'y vois donc pas d'explication a la disparition de la ligne precedante ...
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    14 mai 2006 à 23:08:31

                                    en fait ça revient au début de la ligne en cours

                                    \n saute à la ligne suivante, \r saute au debut de la ligne courante
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      14 mai 2006 à 23:11:40

                                      Citation : Koral

                                      Bon allez, une derniere question : que fait le '\r' exactemment ? Parce que dans les docs soit je ne trouve rien dessus soit on m'indique qu'il fait un "carriage return" (retour charriot ???), je n'y vois donc pas d'explication a la disparition de la ligne precedante ...



                                      Personne n'a parlé de "disparition de la ligne precedante".

                                      Le retour chariot ou carriage return est une dénomination qui s'appliquait aux anciennes imprimantes à tête mobile (voire aux imprimantes actuelles à jet d'encre). C'est une commande qui déplace le 'chariot' (tête d'impression) en debut de ligne, mais sans faire avancer le tambour d'entrainement du papier. La prochaine impression se fait donc par-dessus les caractères déjà imprimés.

                                      Transposée à une console, cette commande replace le curseur en début de ligne. C'est tout. Les écritures suivantes remplacent celles de la ligne précédemment écrite.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Music only !

                                      Pourqui mon programme marche t'il a 2 à l'heure

                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                      • Editeur
                                      • Markdown