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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    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 : 495
    Par défaut De retour au langage C
    Bonjour
    Après trop d'années a ne pas avoir écrit la moindre ligne en C, je m'y remets.
    J'ai installé cygwin64 au vu des conseils d'un post du site.
    J'ai installé l'IDE cpp-neon Éclipse.

    Pour effectuer un test des plus primaires :

    j'ai écrit un énorme programme C

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <stdio.h>
    int main()
    {
     
    	 printf("Ce programme permet de copier un fichier.\n");
    	 return 0;
    }
    … et voici le résultat du compilateur :

    Quel est son problème ?
    C:\cygwin64\bin est présent dans le path

    12:14:25 **** Build of configuration Debug for project LIREFIC ****
    make all 
    Cannot run program "make": Launching failed
    
    Error: Program "make" not found in PATH
    PATH=[C:\cygwin64\bin;C:/Program Files/Java/jdk1.8.0_91/jre/bin/server;C:/Program Files/Java/jdk1.8.0_91/jre/bin;C:/Program Files/Java/jdk1.8.0_91/jre/lib/amd64;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Users\dedalios\eclipse\cpp-neon\eclipse]
    
    12:14:25 Build Finished (took 139ms)
    CYGWIN_HOME pointe sur C:\cygwin64

    Auriez-vous une idée pour résoudre mon problème ?
    Merci.



    AUtres chose Avec CodeBolck+miwgcc pas de problème

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    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 766
    Par défaut
    C'est écrit noir sur blanc Il te manque le logiciel make (+ peut être les binutils, autotools, ....)

    Pour un programme aussi trivial, lance une console cygwin64 et tape soit "gcc my_prog.c" soit "gcc my_prog.c -o my_prog"

    Et la signature de main n'est pas bonne : int main(int /*argc*/, char* /*argv*/[]) {}

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par dedalios Voir le message
    J'ai installé cygwin64 au vu des conseils d'un post du site.
    Ben pas d'un des miens. Pour du C j'aurais plutôt conseillé "mingw". Mais bon, ça dépend aussi de ce qu'on veut faire après...

    Citation Envoyé par foetus Voir le message
    Et la signature de main n'est pas bonne : int main(int /*argc*/, char* /*argv*/[]) {}
    En réalité la signature est plutôt int main(int /*argc*/, char* /*argv*/[], char* /*envp*/[]) {} ...
    Et en fait t'as tout à fait le droit de ne pas déclarer les arguments que tu n'utilises pas.
    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]

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

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Bonjour,
    juste en ce qui concerne la fonction main, la norme C11 impose à la section 5.1.2.2.1 Program Startup :

    The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:
    int main(void) { /* ... */ }
    or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared):
    int main(int argc, char *argv[]) { /* ... */ }
    or equivalent or in some other implementation-defined manner.
    En gros, si on veut être portable et conforme on choisit une des définitions suivant le besoin ou non de connaître les paramètres de la ligne de commande. Tout autre définition de main peut causer des problèmes de portabilités.

    C'est aussi ce que la norme répète à l'annexe J5 où elle note qu'une extension commune est d'avoir un troisième argument pour main sur les plateformes disposant d'un OS :

    In a hosted environment, the main function receives a third argument, char *envp[], that points to a null-terminated array of pointers to char, each of which points to a string that provides information about the environment for this execution of the program (5.1.2.2.1).
    Mais rappelle que l'utilisation de ces extensions rend les programmes non conformes.

    The following extensions are widely used in many systems, but are not portable to all implementations. The inclusion of any extension that may cause a strictly conforming program to become invalid renders an implementation nonconforming.

  5. #5
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    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 : 495
    Par défaut code a voir
    j'ai mis aussi en place codeblock comme ide avec mingcc

    voici un bon de code .

    La phase de lecteur ne fonctionne pas ?
    pourquoi alors que le fichier est plein n'y a til aucun affiche dns le printf .
    Je suppose que le scan n'est de plus pas adapté ici?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
               if(fichierLu != NULL){
               fscanf(fichierLu, "%c", &caracLu);
                    printf("le caractere %c" , &caracLu);
               }
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
     
    /* Les deux paramètres de la fonction main() pour récupérer les
       arguments de la ligne de commande */
    #define TAILLE_BLOC 128
    int main(int argc, char *argv[])
    {
        FILE* fichierLu = NULL;
        FILE* fichierEc = NULL;
        char* fichierNM = NULL;
        char caracLu =  NULL;
        int i;
        char bloc128[128];
        if (argc <= 1) {
        printf("\nLe programme n'a reçu aucun argument\n");
        }
        else {
     
        }
        fichierNM = "C:\\Users\\moi\\Documents\\fic\\OPIL-203330-20161225220501";
        fichierLu = fopen(fichierNM, "r");
        if(fichierLu = NULL)
            {
                printf("Le fichier n'existe pas");
            }
            else
            {
                printf("ouvrir %s \n" ,fichierNM );
               if(fichierLu != NULL){
               fscanf(fichierLu, "%c", &caracLu);
                    printf("le caractere %c" , &caracLu);
               }
            }
            fclose(fichierLu);
     
        return EXIT_SUCCESS;
     
    }

    y til beaucoup de post sur la lecture de fichier lequel serait le plus pertinent pour :
    LE but lire un fichier AIX (unix) sous windows par bloc de 50 caractères .
    le fichier fait 100 caractères ou 500 caractères un multi de50 dans aucune fin de ligne.
    on découpe par bloc de 50
    chaque bloc est analyse dans un tableau de 50 C puis selon des règles non définie ici est modifié pour être écrit dans un fichier de sortie.


    voici le début de l'analyse ( cette partie ne peut pas selon moi être traitée sous forme de chaine à cause de caractère /0 qui risque d'altérer les données)
    et ce n'est pas ce point qui m’intéresse.

    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
    int verifier_128(char zone[50])
    {
      	int i;
      	char codetype;
    	for(i=0; i<51;i++)
        {
            printf("%c\n",zone[i] );
            codetype =  zone[0] ;
            switch (codetype) {
                case '1':
                    type1(zone);
                    break;
                case '2':
                    type2(zone);
                    break;
                case '4':
                    type4(zone);
                break;
              }
        }
    }
     
    int type1(char zone[50]) {
             printf("type 1\n");
    }
     
     int type2(char zone[50]) {
             printf("type 1\n");
    }
    int type4(char zone[50]) {
             printf("type 1\n");
    }
    ce qui m’intéresse en premier lieu c'est la lecture et écriture du fichier
    et donc les post sur ce thème

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

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Par défaut
    Dans le code que tu proposes il y a plusieurs problèmes et incompréhenrions.
    Par exemple le compilateur a dû t'avertir sur : if(fichierLu = NULL) non ?

    Mais dans l'ordre on a :

    char caracLu = NULL; : pas vraiment faux mais pas juste non plus. NULL est réservé pour les pointeurs pas pour les caractères (qui sont un type entier). Pour être correct tu devrais simplement écrire char caracLu = 0; ou char caracLu = '\0';. Le pointeur NULL et le caractère nul sont deux choses différentes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        if(fichierLu = NULL)
            {
                printf("Le fichier n'existe pas");
            }
            else
            {
                printf("ouvrir %s \n" ,fichierNM );
               if(fichierLu != NULL){
    Le dernier if est inutile car tu es dans le else, un endroit où tu es déjà certaine que fichierLu n'est pas NULL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        if(fichierLu = NULL)
            {
                printf("Le fichier n'existe pas");
            }
            else
            {
                 ...
            }
            fclose(fichierLu);
    on ne ferme un fichier que dans le cas où on a réussi à l'ouvrir, sinon UB.

    Il faut toujours vérifier la valeur de retour de fscanf pour savoir la lecture n'a pas échouée (man fscanf).

    Si tu affiches un char avec un %c tu vas afficher un caractère ascii qui sera pas toujours affichable en console. Windows fait une distinction claire entre fichier texte et fichier binaire.

  7. #7
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    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 : 495
    Par défaut A
    je suis vraiment rouillé en C 20 ans sans le codé ... ça fait de dégâts merci pour les conseils


    Quand au problème sous cygwin / Eclipse : 2 machines avec réinstallations complete cigwin +eclipse
    L'une réagit sans problème et l'autre ne trouve pas le make...

    et je ne lit même pas les alertes tu as raison picodev


    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
     
    12:34:33 **** Incremental Build of configuration Debug for project Testc ****
    make all 
    Building file: ../main.c
    Invoking: Cygwin C Compiler
    gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.o" -o "main.o" "../main.c"
    ../main.c: In function 'main':
    ../main.c:25:5: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
         if(fichierLu = NULL)
         ^
    ../main.c:34:17: warning: format '%c' expects argument of type 'int', but argument 2 has type 'char *' [-Wformat=]
                     printf("le caractere %c" , &caracLu);
                     ^
    ../main.c:16:10: warning: unused variable 'bloc128' [-Wunused-variable]
         char bloc128[128];
              ^
    ../main.c:15:9: warning: unused variable 'i' [-Wunused-variable]
         int i;
             ^
    ../main.c:12:11: warning: unused variable 'fichierEc' [-Wunused-variable]
         FILE* fichierEc = NULL;
               ^
    Finished building: ../main.c
     
    Building target: Testc.exe
    Invoking: Cygwin C Linker
    gcc  -o "Testc.exe"  ./main.o   
    Finished building target: Testc.exe
     
     
    12:34:35 Build Finished (took 2s.18ms)

  8. #8
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    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 : 495
    Par défaut
    Citation Envoyé par picodev Voir le message
    Dans le code que tu proposes il y a plusieurs problèmes et incompréhenrions.

    Il faut toujours vérifier la valeur de retour de fscanf pour savoir la lecture n'a pas échouée (man fscanf).

    Si tu affiches un char avec un %c tu vas afficher un caractère ascii qui sera pas toujours affichable en console. Windows fait une distinction claire entre fichier texte et fichier binaire.
    Mon problème est le suivant :
    Le fichier lu est donc au format unix non ascii :
    Il doit être traité en l'état (Le but n'est pas d'en afficher le contenu ). Les données sont pour certaines éventuellement crypté donc de code qui ne sont pas a proprement parlée lisible et ne doivent pas être altérée.
    Mais certaine données au vue de critère de sélection doivent être modifiée. il peut arrive que ces speudos chaines puisse contenir des données de type fin de chaine CR CR/LF LF qui ne devrait pas être la mais je ne créer pas les fichiers .

    donc je cherche quelle est la meilleur méthode de lecture du fichier.
    et la meilleur solution d'écriture

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/01/2007, 10h11
  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, 14h51
  3. [langage] fichier DOS et unix, retour chariot Mac unix
    Par Kinethe dans le forum Langage
    Réponses: 5
    Dernier message: 25/10/2004, 14h05
  4. [langage] compter les retour à la ligne
    Par Kinethe dans le forum Langage
    Réponses: 4
    Dernier message: 16/07/2004, 16h36
  5. Réponses: 8
    Dernier message: 02/04/2004, 17h31

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