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 :

lecture et écriture dans un fichier en c


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Croatie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 5
    Points : 1
    Points
    1
    Par défaut lecture et écriture dans un fichier en c
    Bonsoir,
    j'ai à lire un fichier texte contenant des réels en c, effectuer certains traitement et puis écrire le résultat dans un autre fichier. Le problème que j'ai est que le fichier résultat contient des caractères et non des réels!! meme si j ai utilisé une fonction pour convertir la chaine de caractère en flot (atof). Je n'ai pas su ou est le problème.
    merci pour votre aide
    Images attachées Images attachées   
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par aspiration25 Voir le message
    Bonsoir,
    j'ai à lire un fichier texte contenant des réels en c,
    Salut

    Là déjà t'as tout faux. Ton fichier texte contient... du texte !!!

    Citation Envoyé par aspiration25 Voir le message
    Le problème que j'ai est que le fichier résultat contient des caractères et non des réels!!
    Ben oui, si tu écris un fichier texte il contient lui-aussi... du texte.

    Citation Envoyé par aspiration25 Voir le message
    meme si j ai utilisé une fonction pour convertir la chaine de caractère en flot (atof). Je n'ai pas su ou est le problème.
    Soit dans la lecture du fichier d'origine, soit dans le traitement des données lues, soit dans l'écriture du fichier résultat. T'as mis des printf() pour vérifier chaque étape ???
    Citation Envoyé par aspiration25 Voir le message
    merci pour votre aide
    Oui ben sans plus d'infos on pourra pas t'en dire plus...


    Citation Envoyé par r-onaldo Voir le message
    [B]j'ai fait ce petit code mais il me remplace pas l'espace par le symbole "|" mais il me le rajoute avant alors comment faire:
    Déjà éviter de squater les topics des autres. De plus, feof n'a pas pour but de détecter une fin de fichier durant la lecture mais de dire, une fois que le fichier a été lu, si l'arrêt de la lecture est dû à une fin de fichier ou 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]

  3. #3
    Membre actif
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2011
    Messages : 71
    Points : 214
    Points
    214
    Par défaut
    Qu'est ce que tu entend par caractères ? Peut être voulait tu faire un fichier binaire ?

    Dans ce cas utilise fwrite.

    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    fwrite(&bb1,sizeof(bb1),1,fich);
    fwrite(&bb2,sizeof(bb2),1,fich);
    fwrite(&bb3,sizeof(bb3),1,fich);
     
    /* voir dans un tableau */
    float bb[3];
    fwrite(bb,sizeof(float),3,fich);
    Sinon pour la lecture du fichier, peut être devrait tu utiliser fscanf() où alors, sscanf() pour récupérer les données après les avoirs lues depuis le fichier.

  4. #4
    Membre actif
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2011
    Messages : 71
    Points : 214
    Points
    214
    Par défaut
    @r-onaldo
    il suffit de rajouter un else.

    pour lire un caractère tu peux aussi utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    szBuffer = fgetc(file);
    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
     
    #include <stdio.h>
     
    int main(void)
    {
      FILE *file;
      char szBuffer;
     
      if((file = fopen("fichier.txt", "r")) != NULL) //on ouvre le fichier et verifie si on y arrive
      {
        //si on arrive a ouvrire le fichier tant que l'on est pas a la fin (feof = le premier f g oublier mais les autres c'est End Of File)
        while (!feof(file))
        {
          fread(&szBuffer, 1, 1, file); //on range les caractere dans le buffer
          if(szBuffer == ' ') //si c'est un espace
            printf("|"); //on affiche :" | "
          else	
            printf("%c", szBuffer); //on affiche ce que contient le buffer
        }
      }
      fclose(file);
      return 0;
    }

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Croatie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par pjlan Voir le message
    Qu'est ce que tu entend par caractères ? Peut être voulait tu faire un fichier binaire ?

    Dans ce cas utilise fwrite.

    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    fwrite(&bb1,sizeof(bb1),1,fich);
    fwrite(&bb2,sizeof(bb2),1,fich);
    fwrite(&bb3,sizeof(bb3),1,fich);
     
    /* voir dans un tableau */
    float bb[3];
    fwrite(bb,sizeof(float),3,fich);
    Sinon pour la lecture du fichier, peut être devrait tu utiliser fscanf() où alors, sscanf() pour récupérer les données après les avoirs lues depuis le fichier.
    merci, je veux un fichier texte comme l initial mais son contenu est des lettres en arabe!! fgets est plus adéquate pour lire un fichier texte

  6. #6
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Croatie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Salut

    Là déjà t'as tout faux. Ton fichier texte contient... du texte !!!


    Ben oui, si tu écris un fichier texte il contient lui-aussi... du texte.


    Soit dans la lecture du fichier d'origine, soit dans le traitement des données lues, soit dans l'écriture du fichier résultat. T'as mis des printf() pour vérifier chaque étape ???

    Oui ben sans plus d'infos on pourra pas t'en dire plus...
    je suis désolée pour le retard, oui le fichier est de type texte, il a cette forme
    ItemNo AUC ADU LT
    1 2 3 4
    2 5 7 8
    3 1 2 5

    le resultat est le fichier suivant
    ItemNo AUC ADU LT AUCT ADUT LTT
    1 2 3 4
    2 5 7 8
    3 1 2 5
    min=1 min=2 min=4
    max=5 max=7 max=8

    je pense que le pblm est dans la lecture du fichier

  7. #7
    Membre actif
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2011
    Messages : 71
    Points : 214
    Points
    214
    Par défaut
    ç'est peut être ça le problème alors le C ne gère que l'ascii de base qui est codé sur 8bits. Donc si tu essaie de lire un texte en arabe et de le réecrire c’est probable que ça mette n'importe quoi en effet.

    le type wchar_t de la norme C99 est suceptible de corriger ce problème car il utilise parfois un codage unicode sur 16bits.

    il faut utiliser l'entête wchar.h pour y avoir accès. les fonctions standard du C sont également redéfini pour accepter ce type. Je n'ai pas mon bouqin sous les yeux mais je crois qu'il faut préfixer la fonction par un w

    wfgets,wprintf,wfprintf,....

    Les constantes doivent êtres préfixés par un L.

    ex : wchar_t string[] = L"ça prend en compte les caractères spéciaux";


    Edit :vu comment ton texte est fait utilise fscanf(), ç'est bien moins tordu que de compter les décalages a la main.

    edit2 : ton texte est pas en arabe la si je pige pas ?

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Croatie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par pjlan Voir le message
    ç'est peut être ça le problème alors le C ne gère que l'ascii de base qui est codé sur 8bits. Donc si tu essaie de lire un texte en arabe et de le réecrire c’est probable que ça mette n'importe quoi en effet.

    le type wchar_t de la norme C99 est suceptible de corriger ce problème car il utilise parfois un codage unicode sur 16bits.

    il faut utiliser l'entête wchar.h pour y avoir accès. les fonctions standard du C sont également redéfini pour accepter ce type. Je n'ai pas mon bouqin sous les yeux mais je crois qu'il faut préfixer la fonction par un w

    wfgets,wprintf,wfprintf,....

    Les constantes doivent êtres préfixés par un L.

    ex : wchar_t string[] = L"ça prend en compte les caractères spéciaux";
    merci , j ai en fait ajouté mon fichier initial, et le résultat après exécution ( c le fichier résultat qui ne contient pas des réels...) meme si j ai en lisant le fichier j ai fais la conversion en float

    non le texte n'est pas en arabe, j avais du mal à utliser fscanf, fgets est plus simple

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par aspiration25 Voir le message
    j avais du mal à utliser fscanf, fgets est plus simple
    Plus simple en effet. fscanf() te permet de lire un flux formaté (il peut analyser l'info entrante et séparer les éléments selon le format indiqué) alors que fgets() ne lit que du texte brut sans réfléchir.
    Donc plus simple mais corollairement plus limité. Bien entendu utiliser l'un ou l'autre (ou d'autres comme fgetc() ou fread()) dépend de ton besoin propre...
    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. #10
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Par rapport au problème posé, je ferais un tableau de chaînes de caractères à l'aide d'une fonction split() créée par mes soins.

    De là je récupère tab[1] et tab[2], les transforme en double et les traite.

    Le plus dur c'est la fonction split(), quoique...

    J'avais fais ce type de fonction et une fonction d'affichage

    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
    int split(char **result, char chaine[], char sep)
    {
        int i=0, j=0, k=0;
        while(chaine[i] != '\0')
        {
            if(chaine[i] == sep)
            {
                j++;
                k=0;
            }
            else
            {
                result[j][k] = chaine[i];
                k++;
            }
            i++;
        }
        return j;
    }
     
    void afficher(char **tab, int length)
    {
        int i=0;
        for(; i < length+1; i++) printf("%s\n", tab[i]);
    }
    Exemple d'utilisation

    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
    int main()
    {
        int n=0, len=0;
        char test[] = "Hello World";
        char **res = malloc(20 * sizeof(char *));
        if(res == NULL)
            exit(-1);
        for(; n < 20; n++)
        {
            res[n] = malloc(20 * sizeof(char));
            if(res[n] == NULL)
                exit(-1);
        }
     
        len = split(res, test, ' ');
        afficher(res, len);
     
        /* free */
    Bon il y en a qui vont dire strtok, c'est bien, moi j'aime pas!
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Bon il y en a qui vont dire strtok, c'est bien, moi j'aime pas!
    Moi non plus car elle n'est pas réentrante.
    En revanche, ce que tu as écrit c'est strtok_r()...
    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]

  12. #12
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    En revanche, ce que tu as écrit c'est strtok_r()...
    En effet
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Discussions similaires

  1. Lecture et écriture dans un fichier XOML
    Par SoftAbdou dans le forum Windows Workflow Foundation
    Réponses: 5
    Dernier message: 14/08/2009, 01h04
  2. lecture et écriture dans un fichier Excel
    Par chebmo90 dans le forum Débuter
    Réponses: 5
    Dernier message: 05/08/2009, 15h15
  3. Lecture et écriture dans un fichier .CSV
    Par yann87 dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 03/03/2009, 09h04
  4. lecture et écriture dans un fichier
    Par hamham dans le forum Entrée/Sortie
    Réponses: 8
    Dernier message: 18/12/2007, 15h03

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