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 :

Traitement de données depuis un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut Traitement de données depuis un fichier
    Bonjour,

    Voilà, mon objectif est de créer un programme en C qui prendra en entrée un fichier contenant une succession de lignes de données Hexadécimales terminées chacune par un checksum sur les données, il fera une vérification de tous les checksum de toutes les lignes du fichier (environ 400 000 lignes) et me diras si c'est OK ou pas.
    Mais bon étant débutant en C, je commence à avoir des problèmes alors que mon code ne fait que quelques lignes c'est pourquoi je sollicite vos lumières si précieuses....

    Pour l'instant j'arrive à lire chacune des lignes de mon fichier et maintenant j'aimerai déjà récupérer uniquement le checksum de chaque ligne. La lignerécupérées étant dans un tableau "ligne", il faut que je puisse stocker les 2 derniers caractères dans un autre tableau. Mais voila j'ai une erreur "expected expression before const" à la compil du code ci dessous. Pourriez vous m'éclairer?

    Merci grandement...

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    FILE* fichier = NULL;
    char line[81];
    char* Chksum;
     
     
    int main()
    {
     
     
        fichier = fopen("c:\\Trainesoft\\Cheksum\\S3_test.s3", "r");
     
    if(fichier!= NULL)
        {
            while(fgets(line, 81, fichier) != NULL)
            {
     
                strcpy (Chksum, const char* line[77]);
                printf("%s\n", Chksum);
     
     
            }
     
        }
       else
        {
            printf("No file error");
        }
     
        fclose(fichier);
        return 0;
    }

  2. #2
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 62
    Par défaut
    Bonjour,
    le compilo ne comprend pas ton cast, il faudrait le placer entre parenthèse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy (Chksum, (const char*) line[77]);
    Mais le code resterait quand même incorrect, tu confonds le caractère et son pointeur, je m'explique:
    line est un pointeur sur le premier élément de ton tableau, c'est un char*.
    line[0] est le premier élément de ton tableau, c'est un char.
    De même line[77] est un char or nous avons besoin de son adresse pour strcpy.Tu dois donc utiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy (Chksum, &line[77]);
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy (Chksum, line + 77);
    Attention à la seg fault qui va pointer le bout de son nez :o

    Cordialement

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Par défaut
    Merci pour ta réponse, je n'avais pas saisi que la fonction strcpy avait besoin de l'adresse de la valeur en argument et non la valeur le même...

    Sinon j'ai modifié mon code afin qu'il puisse fonctionner avec des lignes de différentes tailles. Mais maintenant j'ai un autre problème.
    Je traite des lignes dans le while, elles sont stockées dans un tableau de caractères. Je dois convertir l'ensemble des valeurs qui sont en hexadécimal en décimal, pour cela j'utilise la fonction strtoul() mais le compilo me renvoi une erreur sur cette fonction "Expected expression before unsigned"
    Je sais que c'est une erreur de quelqu'un qui n'y comprend rien mais je veux comprendre et en rigoler plus tard!!

    Merci pour votre aide, mon code est ci dessous:

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    FILE* fichier = NULL;
    char lineHex[2000];
    int Linelength;
     
     
    int main()
    {
     
      fichier = fopen("c:\\Trainesoft\\Cheksum\\S3_new.s3", "r");
     
    if(fichier!= NULL)
        {
     
     
            while(fgets(lineHex,2000, fichier)!= NULL)
            {
     
     
                //Extraction d'une ligne de donnée//
                char* ExtractLineHex = strtok (lineHex,"\0");
     
                //Extraction de la longueur de la chaîne de caractère//
                Linelength = strlen(ExtractLineHex);
     
                //Conversion des valeurs Hexadécimales en valeurs décimales//
                unsigned long int ExtractLine = unsigned long int strtoul(ExtractLineHex[Linelength-1], NULL, 16);
     
     
            }
     
        }
       else
        {
            printf("No file error");
        }
     
        fclose(fichier);
        return 0;
    }

  4. #4
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 736
    Par défaut
    Bonjour,

    Citation Envoyé par Seb_33 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                //Conversion des valeurs Hexadécimales en valeurs décimales//
                unsigned long int ExtractLine = unsigned long int strtoul(ExtractLineHex[Linelength-1], NULL, 16);
    stroul retourne comme son nom l'indique un unsigned long int (STRing TO Unsigned Long), donc pas besoin de cast par ailleurs syntaxiquement faux (à moins que ça ne soit une erreur de copier/coller ?).

    Retire simplement le unsigned long int à droite du = de la ligne 30.

  5. #5
    Membre chevronné
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Par défaut
    Salut,

    Pour plus de clarté dans ton code, évite de déclarer tes variables seulement au moment où tu en as besoin. Préfères les déclarer en début de code. (Même si c'est très courant en PHP).

    Tu dois bien retenir que tes fonctions retournent un type précis et qu'il est inutile à chaque fois de préciser leur type de retour quand tu les appelles (comme tu fais avec certaines dans ton code).

    Tu déclares trois variables en global :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FILE* fichier = NULL;
    char line[81];
    char* Chksum;
    Pourquoi ne pas les déclarer dans ton main ? Si d'autres fonctions en ont besoin, tu n'as qu'à les passer en paramètres.

    dM
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

Discussions similaires

  1. Mise à jour, insertion données depuis un fichier excel
    Par Titototi dans le forum VBA Access
    Réponses: 3
    Dernier message: 02/10/2009, 17h27
  2. [MySQL] importer des données depuis un fichier EXEL
    Par islyoung2 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 13/01/2009, 06h14
  3. Intégre des données depuis un fichier xml
    Par KATE6447 dans le forum InfoPath
    Réponses: 5
    Dernier message: 20/03/2008, 13h32
  4. chargement de données depuis un fichier texte
    Par mohamida dans le forum Administration
    Réponses: 1
    Dernier message: 07/01/2007, 17h57
  5. pb d'insertion de données depuis un fichier externe-COPY
    Par boulou32 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 29/01/2005, 18h50

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