Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
951 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Problème Fichiers

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème Fichiers

n°1579213
Atlanted
Posté le 26-06-2007 à 11:25:09  profilanswer
 

Bonjour,
 
J'ai un souci avec les fichiers, j'aimerais récuperer le contenu d'un fichier et le stocké dans un tableau cependant ca ne fonctionne pas et j'ai du mal à saisir pourquoi. J'écris les données dans un fichier puis, lorsque je le lis via fread, il me renvoie les bonnes valeurs. Ici, j'aimerais récuperer mes données avec fscanf pour stocker les données dans un tableau puis les réécrire à nouveau dans un fichier (faire de la modification en somme).
 
Concrètement, quand j'ai z qui vaut 1 j'écris dans mon fichier des données (100 200 ....)
et quand z vaut 2 j'écris des valeurs que j'ai modifié au préalable et qui valent par exemple (200 500 640...). Avec les valeurs non modifié (quand z == 1 ca fonctionne mais quand z vaut 2 non).  
 
En faite, je souhaite récuperer les données avec fscanf des valeurs modifiés pour les comparer avec un autre tableau mais ça ne fonctionne pas et les valeurs lu via fread des valeurs modifiés que j'ai écrite dans le fichier ne sont pas les bonnes. Je pense donc avoir un souci au niveau de fscanf.
 
Si quelqu'un saurait me débloquer.. Merci
 
Voici le bout de code qui pose problème :
 

Code :
  1. FILE *k;
  2.         scanf("%d", &z);
  3.         if(z == 1){
  4.         k = fopen("C:\\test.bin","r+b" );  // Ouvrir pour modification
  5.         for(o=1; o<=9; o++){
  6.             dchm += 20;
  7.             tabc[o-1] = dchm;  }
  8.         fwrite(tabc, sizeof(int), 9, k);       }
  9.         else if(z == 2){
  10.         k = fopen("C:\\distance_connu_dcmaf.bin","r+b" );
  11.         fscanf(k, "%d %d %d %d %d %d %d %d %d", &tabc[1], &tabc[2], &tabc[3], &tabc[4], &tabc[5], &tabc[6], &tabc[7], &tabc[8], &tabc[9]);
  12.        // for(i=1; i<=9; i++)
  13.        // fscanf(k, "%d", &tabc[i]);
  14.         fwrite(tabc, sizeof(int), 9, k);    }
  15.         fclose(k);


mood
Publicité
Posté le 26-06-2007 à 11:25:09  profilanswer
 

n°1579354
Sve@r
Posté le 26-06-2007 à 14:38:46  profilanswer
 

Atlanted a écrit :

Bonjour,
 
J'ai un souci avec les fichiers, j'aimerais récuperer le contenu d'un fichier et le stocké dans un tableau cependant ca ne fonctionne pas et j'ai du mal à saisir pourquoi. J'écris les données dans un fichier puis, lorsque je le lis via fread, il me renvoie les bonnes valeurs. Ici, j'aimerais récuperer mes données avec fscanf pour stocker les données dans un tableau puis les réécrire à nouveau dans un fichier (faire de la modification en somme).
 
Concrètement, quand j'ai z qui vaut 1 j'écris dans mon fichier des données (100 200 ....)
et quand z vaut 2 j'écris des valeurs que j'ai modifié au préalable et qui valent par exemple (200 500 640...). Avec les valeurs non modifié (quand z == 1 ca fonctionne mais quand z vaut 2 non).  
 
En faite, je souhaite récuperer les données avec fscanf des valeurs modifiés pour les comparer avec un autre tableau mais ça ne fonctionne pas et les valeurs lu via fread des valeurs modifiés que j'ai écrite dans le fichier ne sont pas les bonnes. Je pense donc avoir un souci au niveau de fscanf.
 
Si quelqu'un saurait me débloquer.. Merci
 
Voici le bout de code qui pose problème :
 

Code :
  1. FILE *k;
  2.         scanf("%d", &z);
  3.         if(z == 1){
  4.         k = fopen("C:\\test.bin","r+b" );  // Ouvrir pour modification
  5.         for(o=1; o<=9; o++){
  6.             dchm += 20;
  7.             tabc[o-1] = dchm;  }
  8.         fwrite(tabc, sizeof(int), 9, k);       }
  9.         else if(z == 2){
  10.         k = fopen("C:\\distance_connu_dcmaf.bin","r+b" );
  11.         fscanf(k, "%d %d %d %d %d %d %d %d %d", &tabc[1], &tabc[2], &tabc[3], &tabc[4], &tabc[5], &tabc[6], &tabc[7], &tabc[8], &tabc[9]);
  12.        // for(i=1; i<=9; i++)
  13.        // fscanf(k, "%d", &tabc[i]);
  14.         fwrite(tabc, sizeof(int), 9, k);    }
  15.         fclose(k);



 
 
Bon, je pige rien à ce que tu dis. T'écris 100 200 quand z vaut 1, etc... je pige que dalle.
La base d'un traitement d'un fichier est celle-ci:

  • si le fichier est en mode "texte" (par exemple si tu vois une ligne qui contient "100" quand tu l'ouvres avec blocnote) alors la ligne contient en réalité les caractères '1', '0', '0' et '\n' qui se suivent consécutivement et tu peux traiter cette ligne par les fonctions de traitement de texte comme fgets() ou scfanf()
  • si le fichier est écrit en binaire alors la valeur "100" stockée le sera sous forme hexadécimale soit 64 mais tu ne pourras pas traiter cette ligne via un fscanf() car la ligne ne contient pas du texte !!! Il te faudra récupérer la ligne en binaire et transformer ce binaire en numérique


Détail: C'est pas terrible de boucler de 1 à 9 sur un tableau et de traiter "i - 1". Autant boucler directement de 0 à <9...


Message édité par Sve@r le 26-06-2007 à 15:37:24

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1579366
Atlanted
Posté le 26-06-2007 à 14:52:18  profilanswer
 

En faite je chercher à faire la comparaison de 2 tableaux. Dans mon code je chercher à comparer le contenu de tabc avec un autre tableau pour effectuer un traitement par la suite (que je n'ai pas mis ici)..
 
Lorsque z vaut 1 je compare le contenu de tabc avec un autre tableau (que l'on ne voit pas ici), cela fonctionne correctement.
 
Mais quand z vaut 2 ca ne fonctionne pas, je ne pense pas que ce soit due à un fichier binaire ou non. Je cherche juste à récuperer le contenu du fichier valeur par valeur (qui sont séparées par un espace) pour les stocker dans un tableau (tabc ici) à l'aide de fscanf (ou une autre fonction que je connais pas au pire).
 
Re Détail : Si je boucle de 1 à 9 c'est parceque ca m'arrange à l'affichage d'avoir l'indice qui commence à 1 plutot qu'à 0 :)

n°1579421
Sve@r
Posté le 26-06-2007 à 16:04:20  profilanswer
 

Atlanted a écrit :

En faite je chercher à faire la comparaison de 2 tableaux. Dans mon code je chercher à comparer le contenu de tabc avec un autre tableau pour effectuer un traitement par la suite (que je n'ai pas mis ici)..


La comparaison de deux tableaux se fait élément par élément. Tu considères par défaut que tes deux tableaux sont identiques et dès que tu trouves un élément qui diffère, ils sont différents.
 

Atlanted a écrit :

Lorsque z vaut 1 je compare le contenu de tabc avec un autre tableau (que l'on ne voit pas ici), cela fonctionne correctement.
 
Mais quand z vaut 2 ca ne fonctionne pas, je ne pense pas que ce soit due à un fichier binaire ou non. Je cherche juste à récuperer le contenu du fichier valeur par valeur (qui sont séparées par un espace) pour les stocker dans un tableau (tabc ici) à l'aide de fscanf (ou une autre fonction que je connais pas au pire).


Oui mais tu ne peux utliser fscanf() que si ton fichier est un fichier texte. fscanf analyse le texte pris dans le fichier et rempli la variable correspondante. Si ton fichier est binaire, tu stockeras les octets binaires dans ta variable !!!
Pour bien te rendre compte, pas de secret. Faut afficher les valeurs que tu récupères...
 

Atlanted a écrit :

Re Détail : Si je boucle de 1 à 9 c'est parceque ca m'arrange à l'affichage d'avoir l'indice qui commence à 1 plutot qu'à 0 :)


Je sais. C'est l'habitude des débutants en C. Ils ont du mal à se rendre compte que aller de 0 à <9 est aussi clair que d'aller de 1 à 9 (pourquoi ne pas aller de 3 à 11 tant qu'à faire) mais que c'est plus rapide
1) plus rapide de tester "inférieur pur" que "inférieur ou égal"
2) plus rapide de travailler sur "elem[i]" que "elem[i - 1]"


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1579463
Atlanted
Posté le 26-06-2007 à 16:35:07  profilanswer
 

Citation :


Oui mais tu ne peux utliser fscanf() que si ton fichier est un fichier texte. fscanf analyse le texte pris dans le fichier et rempli la variable correspondante. Si ton fichier est binaire, tu stockeras les octets binaires dans ta variable !!!
Pour bien te rendre compte, pas de secret. Faut afficher les valeurs que tu récupères...


Très bonne suggestion que d'afficher pour vérifier (j'y ai même pas pensé..). Pour fscanf je ne savais pas que c'était pour un fichier texte mais alors quelle fonction utiliser pour un fichier binaire ?

Citation :


Je sais. C'est l'habitude des débutants en C.


Bien deviné je débute :p
 
Je vais essayer de creuser un peu tout ça pour voir comment récuperer les données des fichiers binaires. Merci
 
 

n°1579591
Sve@r
Posté le 26-06-2007 à 21:11:51  profilanswer
 

Atlanted a écrit :

Très bonne suggestion que d'afficher pour vérifier (j'y ai même pas pensé..). Pour fscanf je ne savais pas que c'était pour un fichier texte mais alors quelle fonction utiliser pour un fichier binaire ?


J'ai parlé de fichier texte et binaire pour simplifier, mais un fichier quel qu'il soit ne contient que de l'octet.
Si le fichier est écrit comme on écrit dans le bloc note, alors si t'écris 100 ça stockera les caractères '1', '0', '0' et '\n' soit les codes ascii hexadécimaux 48, 49, 49 et 0a
Si le fichier est écrit "au plus serré", alors si t'écris la valeur 100, ça stockera cette valeur codée en hexa soit 64. Mais si tu relis cette valeur (via un fread par exemple), alors ça te mettra ce code 64 dans ton int qui sera retraduit en "100" via l'interprétation que fait le système avec les int
 
Exemples simples d'écriture
Fichier texte

int main()
{
    FILE *fp;
    int nb=100;
    fp=fopen("C:\toto.txt", "w" );
    fprintf(fp, "%d\n", nb);
    fclose(fp);
}


 
Fichier binaire

int main()
{
    FILE *fp;
    int nb=100;
    fp=fopen("C:\toto.bin", "wb" );
    fwrite(&nb, sizeof(int), 1, fp);
    fclose(fp);
}


 
Et la lecture
Fichier texte

int main()
{
    FILE *fp;
    int nb;
    fp=fopen("C:\toto.txt", "r" );
    fscanf(fp, "%d", &nb);
    printf("nb=%d\n", nb);
    fclose(fp);
}


 
Fichier binaire

int main()
{
    FILE *fp;
    int nb;
    fp=fopen("C:\toto.bin", "rb" );
    fread(&nb, sizeof(int), 1, fp);
    printf("nb=%d\n", nb);
    fclose(fp);
}


Message édité par Sve@r le 26-06-2007 à 21:13:20

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1579592
Trap D
Posté le 26-06-2007 à 21:14:47  profilanswer
 

Sve@r >> Pense quand même a vérifier la réussite de l'ouverture des fichiers.

n°1579607
Sve@r
Posté le 26-06-2007 à 21:28:54  profilanswer
 

Trap D a écrit :

Sve@r >> Pense quand même a vérifier la réussite de l'ouverture des fichiers.


Ben j'ai tapé l'exemple minimaliste pour illustrer la notion. Mais effectivement, en programmation "opérationnelle", il est PRIMORDIAL de tester que "fp" ne vaut pas NULL juste après le fopen() avant d'aller plus loin (tu remarqueras d'ailleurs que j'écris directement à la racine de "C:" alors que jamais je ferais ça avec un vrai programme de travail)...


Message édité par Sve@r le 26-06-2007 à 21:31:02

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Problème Fichiers

 

Sujets relatifs
Problème de création de boucles[RESOLU] Probleme pour renommer les fichiers PHP
Problème formulaire d'upload pour les fichiers > 500 Koprobleme upload certains types de fichiers (mp3, guitarpro)
Probleme dans les chemins de fichiersPetit problème d'ordre numérique pour classement de fichiers
Problème fichiers temporairesAWK: Probleme avec longueur des noms de fichiers de données
probleme ordre des fichiers dans une galerieProblème de reconnaissance de fichiers
Plus de sujets relatifs à : Problème Fichiers


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR