Lecture de caractères

Lecture de caractères - C - Programmation

Marsh Posté le 03-04-2005 à 14:26:39    


Bonjour,
 
en petite minuscule (et mauvaise) débutante que je suis, j'aimerais savoir s'il existe un équivalent pour les entiers de getc(f) ?
Plutôt qu'utiliser fscanf(f, "%d", &n) (n est le nom de mon entier) qui, apparemment ne fait pas vraiment ce que je voudrais faire...
 
Et aussi :  
Je dois décoder un fichier de ce type  
1 55 2 66 8
Quand je fais un getc, est ce que les espaces sont pris en compte ? Ds ce cas, il faut que j'en fasse deux pour arriver au caractère suivant ?
 
 
Merci.
 

Reply

Marsh Posté le 03-04-2005 à 14:26:39   

Reply

Marsh Posté le 03-04-2005 à 14:32:32    

Emmylou a écrit :


Plutôt qu'utiliser fscanf(f, "%d", &n) (n est le nom de mon entier) qui, apparemment ne fait pas vraiment ce que je voudrais faire...

mais tu veux faire quoi exactement ?

Emmylou a écrit :


Et aussi :  
Je dois décoder un fichier de ce type  
1 55 2 66 8
Quand je fais un getc, est ce que les espaces sont pris en compte ? Ds ce cas, il faut que j'en fasse deux pour arriver au caractère suivant ?
 
 
Merci.


 


int c;
 
while( ((c = getchar()) != EOF) && !isspace(c) )
{
  /* rien */
}


 
peut par exemple t'aider à manger tous les espaces


Message édité par Taz le 03-04-2005 à 14:33:02
Reply

Marsh Posté le 03-04-2005 à 14:47:04    

c'etait exactement mon 1er exo sur les fichiers^^
mais je ne vois pas du tout le probleme avec les fscanf :  
ca marchait tres bien :

Code :
  1. int a;
  2. FILE* fichier = fopen(nom, "r" );
  3. for(i=0;i<5;i++)
  4. {
  5. fscanf(fichier,"%d", &a);
  6. printf("%d\n",a);
  7. }
  8. fclose(fichier);


Reply

Marsh Posté le 03-04-2005 à 15:10:01    

Re-Bonjour,
 
le problème vient probablement de ma boucle.
 
Ce que je dois faire ?
J'ai un texte codé (rangé dans un fichier).  
Le texte est découpé en suite de segements de telle façon que chaque segment soit composé d'une ou plusieurs occurences du même caractère.  
Chaque segment est codé par deux entiers n et c donnat respectivement le nombre d'occurences du caractères et le code ASCII de ce caractère.
 
[Et moi j'ai rien que des T, tout plein de T alors que je voudrais avoir
*****  Bonnes vacances  *****]
 

Reply

Marsh Posté le 03-04-2005 à 15:31:55    

donne un exemple d'enregistrement

Reply

Marsh Posté le 03-04-2005 à 15:38:11    

Un exemple de ce que j'ai fait ?
 
#include <stdio.h>
void decoder(FILE*f)
{
 int n, j, c;
 fscanf (f, "%d", &n);
 while (c!=EOF)
 {
  c=getc(f);
        if (c=' ')  
        {
        c=getc(f);
        for(j=0; j<n; j++)
      {
                  printf ("%c", &c);
            }
        }
        else
        {
      for(j=0; j<n; j++)
      {
                  printf ("%c", &c);
            }
        }
        c=getc(f);
        fscanf (f, "%d", &n);
   }
return;
}
int main (void)
{
 FILE*f;
 f=fopen ("code.txt", "r" );
 if (f==NULL)
 {
  printf ("Erreur" );
 }
 decoder(f);
 fclose(f);
 return 0;
}  
 
 
J'suis passée par plusieurs choses, mais ça m'affiche toujours plusieurs lignes de T.
Voire même des T qui s'arrêtent jamais de s'afficher.
Ou alors des 0 si je déclare c en variable char.
 
Et le machin que je voudrais décoder est comme ça :
5 42 2 32 1 66 1 111 2 110 1 101 1 115 1 32 1 118 1 97 1 110 1 99 1 101 1 115 2 32 5 42 1 10
 
'Ala
:)

Reply

Marsh Posté le 03-04-2005 à 16:31:52    

c;
 fscanf (f, "%d", &n);
 while (c!=EOF)  
 
c n'est pas initialisé.
 
 
il te faut tester la valeur de c après chaque getc
 
 
 
mais je comprends toujours pas ton problème, tu n'as pas besoin de getc, juste un une boucle simple avec fscanf (oublie pas de tester sa valeur de retour) et voilà. Comme dans ton premier exemple
 
 
while(fscanf(f, "%u %u", &n, &c) == 2)
{
  printf("%u occurences du caractères %c\n", n, (char)c);
}
 

Reply

Marsh Posté le 03-04-2005 à 16:39:07    

Non, non ce que je veux faire, c'est décoder mon texte.
 
(Huhu, j'ai changé et fait ça, maintenant j'ai des lignes de 1, 2, 5 et espace...)
 
void decoder(FILE*f)
{
 int n, c, j;
 fscanf (f, "%d", &n);
    c=getc(f);
 while (c!=EOF)
 {
  j=0;
  fscanf (f, "%d", &n);
        c=getc(f);
        if (c==' ')
        c=getc(f);
        while (j!=n)
        {
              printf ("%c", c);
              j++;
        }
        c=getc(f);
   }
return;
}
 
 
(jsuis vraiment nulle)

Reply

Marsh Posté le 03-04-2005 à 16:50:46    

t'as essayé avec ce que je t'ai dit ? non. parce que c'est vraiment pas compliqué
 

Spoiler :

#include <stdio.h>
 
int main()
{
 unsigned n, c;
 
 while(fscanf(stdin, "%u %u", &n, &c) == 2)
 {
  while(n--)
   putchar((char)c);
 }
 
 return 0;
}

Reply

Marsh Posté le 03-04-2005 à 16:58:36    


Non j'ai pas essayé, d'abord parce que je ne vois pas le rapport avec ce que je dois faire : j'ai un fichier codé et que je dois décoder, en affichant ensuite le résultat du décodage.  
 
Et ensuite parce que je tiens à comprendre tout ce que je fais, pas à 'bêtement' faire comme d'autres font surtout s'ils utilisent des trucs que je connais pas.
[D'autant que je suis notée]

Reply

Marsh Posté le 03-04-2005 à 16:58:36   

Reply

Marsh Posté le 03-04-2005 à 17:07:47    

bah avant de décoder faut ptet lire (correctement) ton fichier non ? Enfin, moi je dis ca, je dis rien hein...

Reply

Marsh Posté le 03-04-2005 à 17:09:22    

ET BEN !
 
tu dis que tu dois lire des couples d'entiers ?
 
while(fscanf(f, "%u %u", &n, &c) == 2)  
 
y a pas de grand secret ...
 
t'es entrain 'bêtement' de faire n'importe quoi, genre 'je rajoute des trucs jusqu'à ce que ça marche'
 
Algorithmiquement, c'est simple : lire un couple et le décoder. Ce sont 2 opérations indépendantes. Quand on voit ta sauce, on en doute. C'est pas clair dans ta tête.
 
Y a pas de mystère. Et d'ailleurs, je ne vois pas ce que tu ne connais pas dans ma solution

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed