# problème C



## vibra (2 Mars 2008)

Bonjour,
Je suis sur mac os x, et j'utilise Xcode pour programmer en C.
J'ai un souci. J'ai vu dans un tutoriel le code ci-dessous code qui m'affiche dans la console tous les caractères contenus dans un fichier appelé test.txt. Je sais qu'il y a d'autres moyens plus simples de le faire, mais ce qui m'intéresse c'est qu'il se produit une erreur et j'aimerais bien la comprendre. L'erreur est que le programme me rajoute "\377" à chaque fois.
Voici le code :

```
int main(int argc, char *argv[])
{
    FILE* fichier = NULL;
    int caractereActuel = 0;
    fichier = fopen("test.txt", "r");
    if (fichier != NULL)
    {
        // Boucle de lecture des caractères un à un
        do
        {
            caractereActuel = fgetc(fichier); // On lit le caractère
            printf("%c", caractereActuel); // On l'affiche
        } while (caractereActuel != EOF); // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)
        fclose(fichier);
    }
    return 0;
}
```
Merci de votre aide.


----------



## ntx (2 Mars 2008)

vibra a dit:


> Bonjour,
> L'erreur est que le programme me rajoute "\377" à chaque fois.


Problème d'encodage, ton programme n'aurait-il pas par hasard des problèmes avec les caractères accentués ?


----------



## tatouille (3 Mars 2008)

```
/* utf8 encoded */
#include <stdio.h>
#include <stdlib.h>
/*
gcc -Wall main.c -o testchar.c 
main.c: In function 'main':
main.c:12: warning: unused variable 'uchar'
*/

int main(int argc, char *argv[]) {
    FILE* fp;
    int c = 0;
    
    if(argc != 2)
        exit(0);
    
    char * uchar = "è";
    
    if ( NULL != (fp = fopen(argv[1], "r")) ) {
        do {
            c = fgetc(fp);
            printf((c < 128) ? "%c" : "\\u%04x", c);
        } while (c != EOF);
        fclose(fp);
    }
    return 0;
}

/* EOF */
```


```
>$ ./testchar main.c 
/* utf8 encoded */
#include <stdio.h>
#include <stdlib.h>
/*
gcc -Wall main.c -o testchar.c 
main.c: In function 'main':
main.c:12: warning: unused variable 'uchar'
*/

int main(int argc, char *argv[]) {
    FILE* fp;
    int c = 0;
    
    if(argc != 2)
        exit(0);
    
    char * uchar = "\u00c3\u00a8";
    
    if ( NULL != (fp = fopen(argv[1], "r")) ) {
        do {
            c = fgetc(fp);
            printf((c < 128) ? "%c" : "\\u%04x", c);
        } while (c != EOF);
        fclose(fp);
    }
    return 0;
}

/* EOF */?
```


----------



## Didier Guillion (3 Mars 2008)

vibra a dit:


> Bonjour,
> Je suis sur mac os x, et j'utilise Xcode pour programmer en C.
> J'ai un souci. J'ai vu dans un tutoriel le code ci-dessous code qui m'affiche dans la console tous les caractères contenus dans un fichier appelé test.txt. Je sais qu'il y a d'autres moyens plus simples de le faire, mais ce qui m'intéresse c'est qu'il se produit une erreur et j'aimerais bien la comprendre. L'erreur est que le programme me rajoute "\377" à chaque fois.
> Voici le code :
> ...



C'est tout a fait normal.
\377 c'est 0xFF (ou EOF dans stdio.h)
Cela veut dire que la fin du fichier est atteinte.
Tu dois faire :
if(caractereActuel!=EOF) printf("%c", caractereActuel); // On l'affiche si ce n'est pas la fin

Cordialement


----------



## tatouille (3 Mars 2008)

oui c est exactement ce que j'ai voulu montre avec le caractere point 
d interogation qui apparait a la fin meme avec un charset different 

deplus voir fseek/fead/read et ce lien (lire buffered/unbuffered)
tu peux rembobiner un fichier (si celui ci n est pas enorme) pour connaitre sa size


----------



## tatouille (4 Mars 2008)

tiens je viens de voir que le second lien est pas passe


----------



## vibra (5 Mars 2008)

ntx a dit:


> Problème d'encodage, ton programme n'aurait-il pas par hasard des problèmes avec les caractères accentués ?


Dans mon programme il n'y a pas de caractères accetués donc il ne devraitpas y avoir de problèmes.
Sinon merci Dider Guillon pour ta réponse.
Et tatouille je n'ai pas compris ce que c'est que le code que tu as mis ?:rose:
Merci de vos réponses.


----------



## tatouille (5 Mars 2008)

vibra a dit:


> Dans mon programme il n'y a pas de caractères accetués donc il ne devraitpas y avoir de problèmes.
> Sinon merci Dider Guillon pour ta réponse.
> Et tatouille je n'ai pas compris ce que c'est que le code que tu as mis ?:rose:
> Merci de vos réponses.



c est une petite reecriture de ton prog, ca prend en argument le nom d'un fichier, j ai encode mon fichier C en utf8 nobom

dans la routine je dis de remplacer tous les caracteres suiperieur a la valeur  (ascii 0-128) une correspondance unicode, dans le fichier C j ai declare une char avec un accent, je compile 

gcc -Wall main.c -o testchar

puis je demande d ouvrir le fichier source encode en utf8 nobom

./testchar main.c

je viens de voir qu il y aune erreur par ailleurs houps

le prog va donc remplacer l accent grave par une correspondance unicode

mais a la fin je print toujours un caractere non voulu comme toi au debut le fameux ?
donc c etait pour demontrer que cela n etait pas un probleme d'accent mais de lecture

tu dois t'arreter "EOF -1"


----------



## vibra (6 Mars 2008)

C'est trop compliqué pour moi tout ça.
En fait mon erreur était d'arrêter la boucle un cran trop tard.
Merci pour vos réponses !


----------

