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

 C Discussion :

De retour au langage C


Sujet :

C

  1. #21
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 492
    Points : 152
    Points
    152
    Par défaut
    voila quelque chose de mieux

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #define TAILLE_MAX 128 // Tableau de taille 128
     
    int main(int argc, char *argv[])
    {
        FILE* fichierLu = NULL;
     
        unsigned char LeBloc_128[TAILLE_MAX] = "";
        fichierLu = fopen("AM002-203330-20161225220501", "r");
     
        if (fichierLu != NULL)
        {
            int Lecar;
            do  {
                int i;
                i = 0;
                do  {
                Lecar = getc(fichierLu);
                putchar(Lecar);
                LeBloc_128[i] = Lecar;
                i++;
                }
                while(   (Lecar  != EOF) && (i < TAILLE_MAX) );
                printf("%s \n" ,LeBloc_128);
                printf("suite \n");
            }
            while(  Lecar != EOF );
     
            fclose(fichierLu);
        }
        else      {
              printf("Pas de fichier");
        }
     
        return 0;
    }

  2. #22
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 600
    Points
    23 600
    Par défaut
    Citation Envoyé par dedalios Voir le message
    ou lala merci pour vos aide a tous 20 ans sans code sa fait de dégât
    À noter que !! se rencontre de temps en temps : cela signifie littéralement « not not » et c'est pratique pour faire une conversion vers un booléen, spécialement quand le type bool n'est pas explicitement défini.

    Par contre, non seulement ce n'est pas ce qu'il te faut ici, mais fais attention au fait que tu as ajouté un point-virgule à la fin de ta boucle while (erreur ultra-classique) :

    EDIT : J'avais manqué le « do { … } ».

  3. #23
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 548
    Points
    10 548
    Par défaut
    Je vois plus un truc comme cela (non testé)


    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #define TAILLE_MAX 128 // Tableau de taille 128
     
     
    int main(int /*argc*/, char* /*argv[]*/) {
        unsigned char buffer[TAILLE_MAX + 1];
        FILE* file;
        int c, nb_blocks, count;
     
        file = fopen("AM002-203330-20161225220501", "r"); // <- rb ???
     
        if (file == NULL) {
            printf("main - error: open file\n\n");
     
            return 0;
        }
     
        c = getc(file);
     
        buffer[0] = '\0';
     
        nb_blocks = 0;
     
        while(c != EOF) {
            count = 0;
            ++nb_blocks;
     
            do  {
                buffer[count] = (unsigned char) c;
     
                ++count;
     
                c = getc(file);
            } while((c != EOF) && (count < TAILLE_MAX));
     
     
            if (count > 0) {
                buffer[count] = '\0';
     
     
                printf("Block %d:\n%s\n\n", nb_blocks, buffer);
            }
        }
     
        fclose(file);
     
        return 1;
    }

    Édit: Testé et correction syntaxique notée par Sve@r

  4. #24
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Par contre, non seulement ce n'est pas ce qu'il te faut ici, mais fais attention au fait que tu as ajouté un point-virgule à la fin de ta boucle while (erreur ultra-classique) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(   (Lecar  != EOF) && (i < TAILLE_MAX) );
    Ben oui, c'est un do { ... } while(); des plus classiques (mal indenté mais ça reste correct)...

    Citation Envoyé par Obsidian Voir le message
    Comme il n'y a rien dans ta boucle while qui puisse modifier tes conditions, tu vas rester bloqué dans une boucle infinie.
    Ben si,le "i" s'incrémente et Lecar récupère du fgetc() à chaque itération...
    Ce code n'est pas des plus élégants ni exempt de bug mais il n'est pas incorrect dans sa syntaxe...


    Citation Envoyé par foetus Voir le message
    (non testé)
    Ben c'est à ça que sert un forum. Certains écrivent et d'autres testent
    Et en fait, pour un code non testé c'est pas mal parce que (erreur de syntaxe mis à part) ça a compilé et fonctionné correctement du premier coup.
    Mais (faut le dire) c'est pas des plus élégants. Ce qui choque ce sont ces deux boucles imbriquées alors que tu traites "un" fichier en remplissant une zone et tu traites la zone quand elle est pleine. A l'image du seau qui se remplit goutte à goutte mais qu'on vide dans les plantes quand il est plein. Avec cette image, on sent mal pourquoi il faudrait deux boucles de remplissage du seau alors que ce que j'ai écrit se lirait plutôt "une boucle avec une condition"...

    Code c : 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #define TAILLE_MAX 128 // Tableau de taille 128
     
    int main() {
    	unsigned char buffer[TAILLE_MAX + 1];
    	FILE* file;
    	int c, nb_blocks, count;
     
    	file = fopen("/etc/passwd", "r"); // Ben oui, pour tester j'ai choisi un fichier bateau...
     
    	if (file == NULL) {
    		printf("main - error: open file\n\n");
     
    		return -1;
    	}
     
     	count=0;
    	nb_blocks = 0;
     	while (1) {
     		c=fgetc(file);
    		if (c == EOF || count == TAILLE_MAX) {
    			buffer[count] = '\0';
    			++nb_blocks;
    			printf("Block %d:\n%s\n\n", nb_blocks, buffer);
    			if (c == EOF) break;
    			count=0;
    		}
    		buffer[count] = c; // cast implicite
    		count++;
    	}
     	fclose(file);
     
    	return 0;		// 0 signifie "ok" pour le shell Unix...
    }
    Voilà. Une boucle de lecture et un traitement particulier sur situation particulière. Et avec un petit break bien placé quand la situation "un peu" particulière se trouve confondue avec la situation "très" particuliière qui indique que tout a été lu.

    Ceci dit j'ai écrit ce code (et contrairement au tien je m'y suis repris à 2 fois avant qu'il fonctionne) à ton idée (lecture caractère par caractère) mais là aussi ça reste du bricolage face à un bon vieux "fread()" des familles...

    Code c : 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
    26
    27
    28
    29
    30
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #define TAILLE_MAX 128 // Tableau de taille 128
     
    int main() {
    	unsigned char buffer[TAILLE_MAX + 1];
    	FILE* file;
    	int nb_blocks, count;
     
    	file = fopen("/etc/passwd", "r");
     
    	if (file == NULL) {
    		printf("main - error: open file\n\n");
     
    		return -1;
    	}
     
    	nb_blocks = 0;
     	while ((count=fread(buffer, sizeof(unsigned char), TAILLE_MAX, file)) > 0) {
    		buffer[count] = '\0';
    		++nb_blocks;
    		printf("Block %d:\n%s\n\n", nb_blocks, buffer);
    	}
     
    	fclose(file);
     
    	return 0;
    }

    Comme quoi, quand on utilise le truc adapté au besoin, on arrive alors à un code qui est à l'élégance ce que sont les équations de Maxwell à l'électromagnétisme...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #25
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 548
    Points
    10 548
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Mais (faut le dire) c'est pas des plus élégants. Ce qui choque ce sont ces deux boucles imbriquées alors que tu traites "un" fichier en remplissant une zone et tu traites la zone quand elle est pleine.
    C'est vrai que la solution avec fread est plus élégante

    Mais:
    1) Je ne travaille jamais avec des boucles infinies et des break. Quitte à avoir des booléens en plus. Peut-être que je devrais.
    2) L'idée de 2 boucles ne me choque pas. J'avais plus l'idée du while + for, qui pour moi est plus propre (surtout après écriture parce que si j'avais 2 while, c'était pour tester EOF à chaque getc)


    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include <stdio.h>
    #include <stdlib.h>
     
     
    #define TAILLE_MAX 128 // Tableau de taille 128
     
     
    int main(int /*argc*/, char* /*argv*/[])
    {
        unsigned char buffer[TAILLE_MAX + 1];
        FILE* file;
        int c, nb_blocks, count;
        unsigned char has_chars;    
     
        file = fopen("AM002-203330-20161225220501", "r"); // <- rb ???
     
        if (file == NULL) {
            printf("main - error: open file\n\n");
     
            return -1;
        }
     
        buffer[0] = '\0';
     
        nb_blocks = 0;
     
        has_chars = 1;
     
        do {
            for(count=0, ++nb_blocks; (has_chars && (count < TAILLE_MAX));) { 
                c = getc(file);
     
                if (c != EOF) {
                    buffer[count] = (unsigned char) c;
                    ++count;
                } else {
                    has_chars = 0;
                }
            }
     
            if (count > 0) {
                buffer[count] = '\0';
     
                printf("Block %d:\n%s\n\n", nb_blocks, buffer);
            }
        } while(has_chars);
     
        fclose(file);
     
        return 0; // 0 signifie "ok" pour le shell Unix...
    }

    Édit: Corrigé par Sve@r C'est l'incrémentation automatique du compteur qui prend en compte le EOF

  6. #26
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par foetus Voir le message
    1) Je ne travaille jamais avec des boucles infinies et des break.
    Ouais t'as raison. Quand c'est trop facile et trop simple à écrire (et surtout à relire) ça n'est plus amusant. Quoi de mieux qu'un code à la "Benjamin Gates" pour passer sa nuit...
    Citation Envoyé par foetus Voir le message
    parce que si j'avais 2 while, c'était pour tester EOF à chaque getc
    Oui, mais moi aussi je teste EOF à chaque getc()...

    Citation Envoyé par foetus Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
    #include <stdlib.h>
     
     
    #define TAILLE_MAX 128 // Tableau de taille 128
     
     
    int main(int /*argc*/, char* /*argv*/[])
    {
        ...
    }
    Alors là il y a eu un souci parce que ton code sur mon "/etc/passwd" m'a affiché un caractère de trop à la fin (ce caractère fait en fait partie du bloc précédent).

    Après recherche, je me suis rendu compte que l'erreur venait du "count++" dans le for (donc en fin de boucle) alors qu'il faut augmenter count dès que le buffer a été rempli. Sinon, il y a un souci (je pense) quand tu mets le '\0' à la dernière itération

    Bref remplacer
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            for(count=0, ++nb_blocks; (has_chars && (count < TAILLE_MAX)); ++count) { 
                c = getc(file);
    
                if (c != EOF) {
                    buffer[count] = (unsigned char) c;
                } else {
                    has_chars = 0;
                }
            }

    par
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            for(count=0, ++nb_blocks; has_chars && (count < TAILLE_MAX);) { 
                c = fgetc(file);
     
                if (c != EOF) {
                    buffer[count++] = (unsigned char) c;
                } else {
                    has_chars = 0;
                }
            }
    ...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #27
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 492
    Points : 152
    Points
    152
    Par défaut Nouvelle Version
    Bon cette méthode semble fonctionner en partie du moins
    pour autant , lorsque qu'il affiche les donnees le bloc ne début pas toujours par zero


    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #define TAILLE_MAX 128 // Tableau de taille 128
     
    int main(int argc, char *argv[])
    {
        FILE* fichierLu = NULL;
     
        unsigned char LeBloc_128[TAILLE_MAX] = "";
        fichierLu = fopen("AM5", "r");
     
        if (fichierLu != NULL)
        {
            int Lecar;
            do  {
                int i = 0;
                do  {
                    Lecar = getc(fichierLu);
                    /*putchar(Lecar);*/
                    LeBloc_128[i] = Lecar;
                    i++;
                }   while (  i <= TAILLE_MAX  );
     
                if (LeBloc_128[0] =='0')
                {
                    printf("%s\n" ,LeBloc_128);
                }
     
            }
            while(  Lecar != EOF );
     
            fclose(fichierLu);
        }
        else      {
              printf("Pas de fichier");
        }
     
        return 0;
    }

  8. #28
    Membre expérimenté

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Points : 1 672
    Points
    1 672
    Par défaut
    Hello,
    Je ne sais pas si cela peut être la cause de ton problème, mais j'ai remarqué que ton tableau a une taille de 128 chars, et que tu le remplis entièrement... Il n'y a donc pas de '\0' de terminaison, ce qui peut conduire à un certain nombre de problème si tu veux utiliser ton tableau en tant que chaine de caractères. En particulier cela pourrait conduire "printf" à afficher n'importe quoi.

  9. #29
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dedalios Voir le message
    Bon cette méthode semble fonctionner en partie du moins
    pour autant , lorsque qu'il affiche les donnees le bloc ne début pas toujours par zero
    Oui mais que veux-tu qu'on te dise ??? On t'a fourni des codes fonctionnels qui font ce que tu veux. Pourquoi tu ne les étudies pas un peu au lieu de t'enferrer dans tes trucs à 2 balles ???

    Et (déjà dit donc maintenant je vais insister): TU N'AS PAS LE DROIT DE FAIRE printf("%s", LeBloc_128) PARCE QUE CE TABLEAU NE CONTIENT PAS DE '\0' !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #30
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Enfin... Techniquement tu peux mais ça va faire n'importe quoi

  11. #31
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 492
    Points : 152
    Points
    152
    Par défaut
    a j'ai lue le poste trop vite est n'avais pas vue vos propositions

    Citation Envoyé par Matt_Houston Voir le message
    EOF est de type int et non char. Ce n'est pas de cette manière que l'on utilise fread.

    Deux conseils :

    • se référer au manuel ;
    • compiler avec les avertissements : -pedantic -Wall -Wextra.
    Dans codeblock je cherche ou mettre ses avertissements ?

  12. #32
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 215
    Points : 10 140
    Points
    10 140
    Par défaut
    Une recherche sur google avant de poser cette question ?
    Alors sur C::B build option -> Compiler settings -> Other Options

  13. #33
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 492
    Points : 152
    Points
    152
    Par défaut Revue de code sur la base de vos explications
    voici
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #define TAILLE_MAX 128 // Tableau de taille 128
     
    int main() {
    	unsigned char buffer[TAILLE_MAX + 1]; //tabeau avec le 129 /0 pour l'affichage
    	FILE* file;
    	int i, c, nb_blocks, count;
     
    	file = fopen("AM002-203330-20161225220501", "r");
     
    	if (file == NULL) {
    		printf("main - error: open file\n\n");
    		return -1;
    	}
     
     	count=0;
    	nb_blocks = 0;  //
     	while (1) {
     		c=fgetc(file);
    		if (c == EOF || count == TAILLE_MAX) {
    			buffer[count] = '\0';
    			++nb_blocks;
    			if (buffer[0]=='2' )
                {
                    if ( buffer[35] == 'A') {
                        printf("Block A2%d:\n%s\n\n", nb_blocks, buffer);
     
                        /* vidage 119-128 10A*/
                        for( i =118; i <= 127 ; ++i)  buffer[i]= ' ';
                        printf("PostBlock A2%d:\n%s\n\n", nb_blocks, buffer);
                    }
                }
    			//printf("Block %d:\n%s\n\n", nb_blocks, buffer);
    			if (c == EOF) break;
    			count=0;
    		}
    		buffer[count] = c; // cast implicite
    		count++;
    	}
     	fclose(file);
     
    	return 0;		// 0 signifie "ok" pour le shell Unix...
    }
    il ne me reste plus qu'a réécrire les block dans un fichier de sortie renommer sans la fin de chaine
    .puis a prendre en compte que le premier paramètre du main est le nom du fichier.
    l'affaire et terminer

    python perl aurait plus être plus judicieux mais j'avais besoin de rajeunir

  14. #34
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 492
    Points : 152
    Points
    152
    Par défaut codebock
    bonjour
    je cherche ou ajouter les arguments dans code block.
    pas dans le code en C dans mais dans l'IDE

  15. #35
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 492
    Points : 152
    Points
    152
    Par défaut erreur de segmentation
    faut de quelque exemple
    j'ai testé ceci

    creer un nouveau type
    lui allouer des de l'epace memoire je ne suis base sur une doc.
    mais quid de l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		memset(p_fic_lu->nom ,0,150);
    cette ligne me renvoi un erreur de segmentation donc un débordement ou une erreur d'allocation de mémoire ?

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #define TAILLE_MAX 128 // Tableau de taille 128
    #define VRAI  1
    #define FAUX  0
    
    
        typedef struct str_fichier{
        char *nom ;
        FILE* p_fic;
        int longueur;
        } type_fic, * p_type_fic;
    
    int main(int argc , char * argv[]) {
    
    
    	unsigned char buffer[TAILLE_MAX + 1]; //tabeau avec le 129 /0 pour l'affichage
    	FILE* file;
    	int i, c, nb_blocks, count;
        int taille_chaine;
    
    
    
    
        // allocation  des deux str_fichier
        type_fic fic_lu = {NULL,NULL,0};
        type_fic fic_ecr = {NULL,NULL,0};
        p_type_fic p_fic_lu = (p_type_fic)  malloc(sizeof(fic_lu));
        p_type_fic p_fic_ecr = (p_type_fic)  malloc(sizeof(fic_ecr));
    
    
    
    
    if (argc <1) {
        if (argc >=2) {
            		printf("Pas de prise en charge des arguments en exces\n\n");
    
        } else{
    
        taille_chaine= strlen(argv[1]);
        memset(p_fic_lu->nom ,0,taille_chaine);
        strcpy(p_fic_lu->nom ,  argv[1]);
        }
    } else
    {
    		printf("Absence du parametre  \n\n");
    
    		// valeur par defautdu fichier d'entree en phase de test
    		// en phase finale sortir du programme
    		//		return EXIT_FAILURE; //fin de traitement
    
        //	strcpy(p_fic_lu->nom ,  "//home//eric//Documents//Exo0001//AM022-203248-20161227145845");
        //  strcpy(p_fic_lu->nom , "C:\\Users\\moi\\Documents\\Exo0001\\AM022-203248-20161227145845");
    
    		memset(p_fic_lu->nom ,0,150);
    		strcpy(p_fic_lu->nom ,  "/home/eric/Documents/Exo0001/AM022-203248-20161227145845");
            p_fic_lu->longueur = strlen(p_fic_lu->nom );
    }
    
            printf("Fichier en lecture %s   \n\n",p_fic_lu->nom);
        // definition du fichier de sortie
        p_fic_ecr->longueur = p_fic_lu->longueur + 5;
        memset(p_fic_ecr->nom ,0,p_fic_ecr->longueur);
        strcpy(p_fic_ecr->nom , p_fic_lu->nom);
        strcat(p_fic_ecr->nom, "_OUT");
    
    
            printf("Fichier en écriture %s   \n\n",p_fic_ecr->nom);
    
    
    	file = fopen(p_fic_lu->nom, "r");
    
    	if (file == NULL) {
    		printf("Absence du fichier %s ou problèmede lecture  \n\n",p_fic_lu->nom);
    		free(p_fic_lu);
                     free(p_fic_ecr);
    		return EXIT_FAILURE; //fin de traitement
    	}
    
    
     	count=0;
    	nb_blocks = 0;  //
     	while (1) {
     		c=fgetc(file);
    		if (c == EOF || count == TAILLE_MAX) {
    			buffer[count] = '\0';
    			++nb_blocks;
    			if (buffer[0]=='2' )
                {
                    if ( buffer[35] == 'A') {
                        printf("Block A2%d:\n%s\n\n", nb_blocks, buffer);
    
                        /* vidage 119-128 10A*/
                        for( i =118; i <= 127 ; ++i)  buffer[i]= ' ';
                        printf("PostBlock A2%d:\n%s\n\n", nb_blocks, buffer);
                    }
                }
    			//printf("Block %d:\n%s\n\n", nb_blocks, buffer);
    			if (c == EOF) break;
    			count=0;
    		}
    		buffer[count] = c; // cast implicite
    		count++;
    	}
     	fclose(file);
     	//dealloaction des structures str_fichier
    	free(p_fic_lu);
        free(p_fic_ecr);
    	return EXIT_SUCCESS;
    }

  16. #36
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 360
    Points : 23 600
    Points
    23 600
    Par défaut
    Bonjour,

    « nom » est un pointeur, qui par défaut ne pointe sur rien.

    Certes, en début de programme, tu fais bien un malloc pour allouer structure référencée par p_fic_lu, ce qui te permet entre autres d'initialiser le pointeur « nom » lui-même, mais tu n'alloues pas la mémoire (les 150 caractères) que ce pointeur est justement censé pointer.

    Quand tu fais ton memset(), la valeur de ce pointeur est indéfinie et tu vas donc écraser 150 caractères consécutifs n'importe en mémoire.

  17. #37
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 492
    Points : 152
    Points
    152
    Par défaut
    oui je me suis base sur un exemple ou le champ nom est définie char nom[25000] et effectivement dans ce cas l'allocation est cohérente contrairement à mon opération (le repas porte conseil)

    merci pour tes remarques

  18. #38
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 492
    Points : 152
    Points
    152
    Par défaut code modifié
    voici la modification
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #define TAILLE_MAX 128 // Tableau de taille 128
    #define VRAI  1
    #define FAUX  0
     
     
        typedef struct str_fichier{
        char *nom ;
        FILE* p_fic;
        int longueur;
        } type_fic, * p_type_fic;
     
    int main(int argc , char * argv[]) {
     
     
    	unsigned char buffer[TAILLE_MAX + 1]; //tabeau avec le 129 /0 pour l'affichage
    //	FILE* file;
    	int i, c, nb_blocks, count;
        int taille_chaine;
     
     
     
     
        // allocation  des deux str_fichier
        type_fic fic_lu = {NULL,NULL,0};
        type_fic fic_ecr = {NULL,NULL,0};
        p_type_fic p_fic_lu = &fic_lu;
        p_type_fic p_fic_ecr = &fic_ecr;
     
    if (argc <1) {
        if (argc >=2) {
            		printf("Pas de prise en charge des arguments en exces\n\n");
     
        } else{
     
        taille_chaine= strlen(argv[1]);
     
        p_fic_lu->nom = malloc( taille_chaine * sizeof(char));
        memset(p_fic_lu->nom ,0,taille_chaine);
        strcpy(p_fic_lu->nom ,  argv[1]);
        }
    } else
    {
    		printf("Absence du parametre  \n\n");
     
    		// valeur par defautdu fichier d'entree en phase de test
    		// en phase finale sortir du programme
    		//		return EXIT_FAILURE; //fin de traitement
     
        //	strcpy(p_fic_lu->nom ,  "//home//eric//Documents//Exo0001//AM022-203248-20161227145845");
        //  strcpy(p_fic_lu->nom , "C:\\Users\\moi\\Documents\\Exo0001\\AM022-203248-20161227145845");
            taille_chaine = 150;
            p_fic_lu->nom = malloc( taille_chaine * sizeof(char));
    		memset(p_fic_lu->nom ,0,taille_chaine);
    		strcpy(p_fic_lu->nom ,  "/home/eric/Documents/Exo0001/AM022-203248-20161227145845");
            p_fic_lu->longueur = taille_chaine;
    }
     
        printf("Fichier en lecture %s   \n\n",p_fic_lu->nom);
        // definition du fichier de sortie
        taille_chaine= p_fic_lu->longueur + 5;
        p_fic_ecr->nom = malloc( taille_chaine * sizeof(char));
     
        memset(p_fic_ecr->nom ,0,p_fic_ecr->longueur);
     
        strcpy(p_fic_ecr->nom , p_fic_lu->nom);
        strcat(p_fic_ecr->nom, "_OUT");
     
        printf("Fichier en écriture %s   \n\n",p_fic_ecr->nom);
     
     
        p_fic_lu->p_fic = fopen(p_fic_lu->nom, "r");
     
     
        //file = fopen(p_fic_lu->nom, "r");
     
    	//if (file == NULL) {
    	if (p_fic_lu->p_fic == NULL) {
                printf("Absence du fichier %s ou problèmede lecture  \n\n",p_fic_lu->nom);
                free(p_fic_lu->nom);
                free(p_fic_ecr->nom);
                return EXIT_FAILURE; //fin de traitement
            }
     
     
     	count=0;
    	nb_blocks = 0;  //
     	while (1) {
     		c=fgetc(    p_fic_lu->p_fic);
    		if (c == EOF || count == TAILLE_MAX) {
    			buffer[count] = '\0';
    			++nb_blocks;
    			if (buffer[0]=='2' )
                {
                    if ( buffer[35] == 'A') {
                        printf("Block A2%d:\n%s\n\n", nb_blocks, buffer);
     
                        /* vidage 119-128 10A*/
                        for( i =118; i <= 127 ; ++i)  buffer[i]= ' ';
                        printf("PostBlock A2%d:\n%s\n\n", nb_blocks, buffer);
                    }
                }
    			//printf("Block %d:\n%s\n\n", nb_blocks, buffer);
    			if (c == EOF) break;
    			count=0;
    		}
    		buffer[count] = c; // cast implicite
    		count++;
    	}
     	fclose(    p_fic_lu->p_fic);
     	//dealloaction des structures str_fichier
    	free(p_fic_lu->nom);
        free(p_fic_ecr->nom);
    	return EXIT_SUCCESS;
    }

  19. #39
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Je ne voudrais pas être désagréable, mais tu es en train de faire un mauvais programme en mauvais C même si l'idée de départ te semble bonne.

    Que crois-tu qu'un bout de code comme le suivant fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (argc <1) {
        if (argc >=2) {
    Si argc est strictement plus petit que 1 il ne pourra jamais être plus grand ou égal que 2 … et je passe les autres incompréhensions et mécompréhensions que tu as de C, comme allouer ce qu'on manipule avant de le manipuler, les différences entre tableaux et pointeurs, etc. Mieux indenter ton code ne serait pas non plus du luxe.

    Ce que tu cherches à faire est de simplement produire un programme qui prend deux arguments qui sont des noms de fichiers. Tu veux ouvrir le premier, le lire par bloc de 128 octets (d'ailleurs pourquoi 128 ? pourquoi pas 1024 ou 11872 ? y a-t-il un raison ?), afficher ces octets lus comme une chaîne de caractère et les écrire dans le second fichier.

    Pour faire cela il y a plusieurs étapes :
    • vérifier qu'il y a bien 2 arguments passés sur la ligne de commande → argc==3
    • vérifier que le premier argument est bien un fichier régulier valide et qu'il est lisible, le cas échéant l'ouvrir
    • vérifier que le second argument est bien un nom de fichier valide, qu'il n'existe pas, que tu peux le créer, le cas échéant le créer
    • si une erreur est détectée alors laisser le programme dans un état propre, afficher un message d'erreur, quitter
    • entrer dans la boucle de lecture/affichage/écriture
      • lire les données, s'il n'y a pas d'erreur on continue
      • afficher les données (pas la peine de te prendre la tête avec un \0 à la fin du buffer, lire le man de printf)
      • écrire les données, s'il n'y a pas d'erreur on recommence
    • s'il y a eu une erreur, la traiter → avertir, effacer le début de fichier créé ?, …
    • s'il n'y a pas eu d'erreur, fermer proprement les fichiers, afficher des stats? et sabler le champagne


    Il faut un minimum d'algorithme avant de simplement penser à coder. Une fois à ce stade tu peux commencer à réfléchir sur les sdd que tu pourrais utiliser, détailler un peu plus les traitements, etc. Ensuite tu peux commencer à partir d'un brouillon de structure de programme à pisser du code.
    Si tu ne fais pas ça tu pars dans tous les sens en essayant de faire tomber un pseudo programme en marche au petit bonheur la chance, ce qui à terme est voué à l'échec.

  20. #40
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 562
    Points : 7 628
    Points
    7 628
    Par défaut
    Citation Envoyé par dedalios Voir le message
    voici la modification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        ...
        taille_chaine= strlen(argv[1]);
        p_fic_lu->nom = malloc( taille_chaine * sizeof(char));
        memset(p_fic_lu->nom ,0,taille_chaine);
        strcpy(p_fic_lu->nom ,  argv[1]);
        ...
    Et non.
    Une chaîne à toujours un caractère terminateur, il faut aussi réserver de la mémoire pour lui.
    Et pourquoi mettre à zéro un buffer qui est immédiatement re-rempli la ligne suivante?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        ...
        taille_chaine = strlen( argv[1] ) + 1; // strlen() ne comptabilise pas le terminateur
        p_fic_lu->nom = malloc( taille_chaine );
        strcpy( p_fic_lu->nom ,  argv[1] );

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/01/2007, 11h11
  2. [WinForms][Tout langage] retour chariot textbox multiligne
    Par frjover dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 21/12/2006, 15h51
  3. [langage] fichier DOS et unix, retour chariot Mac unix
    Par Kinethe dans le forum Langage
    Réponses: 5
    Dernier message: 25/10/2004, 15h05
  4. [langage] compter les retour à la ligne
    Par Kinethe dans le forum Langage
    Réponses: 4
    Dernier message: 16/07/2004, 17h36
  5. Réponses: 8
    Dernier message: 02/04/2004, 18h31

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