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 :

les fichiers en c


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2013
    Messages : 36
    Par défaut les fichiers en c
    Bonsoir a tout le monde,

    En fait,je suis débutant en C,et je veux lire un fichier texte(test.txt) qui contient des données sous forme matrice
    et l'affiche sur le console
    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>
    #define MAX_LIGNE 10   /* au maximum, 10 lignes */
    #define MAX_COL    8   /* au maximum 8 colonnes */
    #define NOM_A_LIRE "C:\\test.txt" /*matrice a lire*/
    typedef float Matrice[MAX_LIGNE] [MAX_COL];
    /*fonction lire qui lit la matrice (sous forme de fichier .txt)*/
    void lire(FILE * aLire, Matrice mat, int nbLigne, int nbCol) {
       int i, j ;
       for (i = 0 ; i < nbLigne; i++) {
     	  for (j = 0 ; j < nbCol; j++)
           fscanf(aLire, "%f", &mat[i] [j]);
     	  fscanf(aLire, "\n" );
       }
    void afficher(Matrice mat, char nom[], int nbLigne, int nbCol)
    {
       int i, j ;
       printf("\nContenu de la matrice %s de %d ligne(s) et %d colonne(s) :\n",nom, nbLigne, nbCol);
       for (i = 0 ; i < nbLigne; i++) {
     	  for (j = 0 ; j < nbCol; j++)
           printf("%6.2f ", mat[i] [j]);
     	  printf("\n" );
       }
       printf("\n" );
    }
    int main(void)
    {
    Matrice A;
    int  m, n;
        /* ouvrir le fichier Matrices.dta sur le disque réseau pour la lecture */
    FILE * aLire = fopen(NOM_A_LIRE, "r" ) ;
     if(aLire == NULL)
        {
           printf("Le fichier n'existe pas" );
        }
     else
     {          fscanf(aLire,"%d%d\n", &m, &n);
       lire (aLire, A, m, n);
       afficher(A, "A", m, n);
     }
    fclose(aLire);
    return 0;
    }
    mais il plante et affiche "
    attention : 'main' is normally a non-static function [-Wmain]
    erreur: expected declaration or statement at end of input
    Est ce que quelqu'un peut m'aider je serai trés reconnaissant
    Fichiers attachés Fichiers attachés

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void lire(FILE * aLire, Matrice mat, int nbLigne, int nbCol) {
       int i, j ;
       for (i = 0 ; i < nbLigne; i++) {
     	  for (j = 0 ; j < nbCol; j++)
           fscanf(aLire, "%f", &mat[i] [j]);
     	  fscanf(aLire, "\n" );
       }
    Il ne manquerait pas un petit "}" à la fin ?

    Essaye de mettre 2 retours à la lignes entre tes fonctions, il te sera alors plus facile de repérer ce genre d'erreur.

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2013
    Messages : 36
    Par défaut
    Merci pour votre réponse
    mais le résultat ne s'affiche pas correctement ,il n'affiche pas le contenu de la matrice .voila ce qu'il m'affiche :
    Contenu de la matrice A de 2 ligne(s) et 1 colonne(s):
    0.00
    1.00
    étant donnée que mon fichier test est ci joint
    Fichiers attachés Fichiers attachés

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    C'est normal : ton fichier test est :
    2 1 0
    1
    4 2
    4 2 10
    Il lit m et n qui prennent les valeurs 2 et 1 puis il lit les deux éléments de la matrice 2x1 qui sont 0 et 1

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2013
    Messages : 36
    Par défaut
    Merci beaucoup ça marche très bien

    En fait j'ai une autre question, je veux faire des modifications sur cette matrice et je veux afficher le résultat(matrice modifié après calcul) dans le console
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void calculermatrice (Matrice mat, int nbLigne, int nbCol)
    {
    	int i, j,k ;
     
        for(j=0;j<nbCol;j++)
          for(k=1;k<j-1;k++)
           {
               mat[j][j]=mat[j][j]-(mat[j][k]*mat[j][k]*mat[k][k]);
           }
    .....
    et dans le int main j'ai ajouté
    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
    int main(void)
    {
    	Matrice A;
    	int  m, n;
        /* ouvrir le fichier Matrices.dta sur le disque réseau pour la lecture */
    	FILE * aLire = fopen(NOM_A_LIRE, "r") ;
    	 if(aLire == NULL)
        {
           printf("Le fichier n'existe pas");
        }
    	 else
     
    	 {                     fscanf(aLire,"%d %d\n", &m, &n);
    				lire (aLire, A, m, n);
    				afficher(A, "A", m, n);
    				calculermatrice (A,m,n);
    				afficher(A, "A", m, n);
    	 }
    fclose(aLire);
    return 0;
     
    }
    pour le résultat il m'affiche la matrice initiale sans modification

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    mots clés: passage par valeur, passage par référence, pointeur.

    les arguments d'une fonction sont passés par copie. le Matrice dans la fonction est une copie de celle passée en argument.

    Si ta fonction prenait un pointeur sur Matrice, il y a aurait copie du pointeur, mais cette copie pointerait sur la même Matrice, que tu pourrais du coup modifier.

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par leternel Voir le message
    mots clés: passage par valeur, passage par référence, pointeur.

    les arguments d'une fonction sont passés par copie. le Matrice dans la fonction est une copie de celle passée en argument.

    Si ta fonction prenait un pointeur sur Matrice, il y a aurait copie du pointeur, mais cette copie pointerait sur la même Matrice, que tu pourrais du coup modifier.
    Mais c'est le cas ici : Matrice est un tableau, c'est donc l'adresse du premier élément du tableau qui est passé.

    Le fait que le tableau est inchangé est purement fortuit et résulte du calcul effectué. Il suffit d'essayer en modifiant la fonction de calcul pour voir que le tableau est effectivement modifié au retour dans main(). Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void calculermatrice (Matrice mat, int nbLigne, int nbCol)
    {
    	int i, j,k ;
     
        for(j=0;j<nbCol;j++)
    //      for(k=1;k<j-1;k++)
           {
               mat[j][j]=128;//mat[j][j]-(mat[j][k]*mat[j][k]*mat[k][k]);
           }
    }

  8. #8
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2013
    Messages : 36
    Par défaut
    merci pour vos réponses
    mais la matrice s'affiche comme suit
    -107374176.00 -107374176.00 -107374176.00
    -1.50 -107374176.00 -107374176.00
    0.50 2.00 -107374176.00

    Appuyez sur une touche pour continuer...
    étant donnée qu'elle doit être une matrice triangulaire inférieure avec diagonale égale a zéro. je sais pas d'ou vient ses "-107374176.00" qui sont partout

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    Par défaut
    Citation Envoyé par benois123 Voir le message
    étant donnée qu'elle doit être une matrice triangulaire inférieure avec diagonale égale a zéro. je sais pas d'ou vient ses "-107374176.00" qui sont partout
    Lorsque tu alloues de la mémoire dynamiquement, que ce soit dans la pile ou avec malloc(), celle-ci n'est jamais initialisée par défaut. L'espace t'est réservé mais tu le trouves dans l'état ou il était lorsque tu as fait ta réservation. Le contenu initial de ta matrice est donc complètement indéfini et dans certains cas, si tu libères puis réalloues exactement la même structure, il se peut que celle-ci retourne à la même place et que son contenu soit donc exactement celui de la précédente, ce qui peut provoquer des bugs assez difficiles à cerner.

    En l'occurrence, un float tient toujours sur quatre octets, par définition. Si tu essaies de voir quel est leur contenu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdint.h>
    #include <stdio.h>
     
    int main (void)
    {
        float x = -107374176.00;
     
        printf ("%08x\n",*(uint32_t *)&x);
        return 0;
    }
    … tu obtiens :

    Code Shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ ./programme
    cccccccc

    … et « CC » est la valeur utilisée par Visual C++ pour remplir les zones non initialisées de la pile en mode debug.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [TP]comment creer une disquette bootable (les fichiers)
    Par ludovic5532 dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 25/10/2003, 18h46
  2. Réponses: 4
    Dernier message: 16/08/2003, 13h21
  3. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  4. [TP]Lister les fichiers d'un répertoire
    Par nvtitan dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 21/06/2002, 11h22
  5. Les fichiers d'un projet
    Par Manolo dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/05/2002, 17h51

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