OVH Cloud OVH Cloud

fgets(), fputs() et type unsigned char*

4 réponses
Avatar
Jan
Salut à tous,

j'ai un petit problème avec un code simple qui écrit et lit des données
dans un fichier car les fonctions fputs() et fgets() ne veulent pas
prendre des tableaux de charactères non signés comme paramètres :

const unsigned char string1[] = { 168, 21, 242, 190, 155, 24, 5, 165};
unsigned char string2[8];

fp=fopen("file.txt","w");
fputs(string1,fp); //écriture dans le fichier
fclose(fp);

fp=fopen("file.txt","r");
fgets(string2,8,fp); //lecture dans le fichier
fclose(fp);

A la compilation (avec gcc) j'ai les erreurs suivantes pour fputs() et
fgets() respectivement :
invalid conversion from `const unsigned char*' to `const char*'
invalid conversion from `unsigned char*' to `char*'

Quelles possibilités ai-je pour pouvoir écrire et lire ces données avec
un type unsigned ? J'ai essayé de faire des conversions du genre
fputs((unsigned char*)string2,fp) mais sans résultats...

Merci d'avance,
Jan.

4 réponses

Avatar
Antoine Leca
En , Jan va escriure:
j'ai un petit problème avec un code simple qui écrit et lit des
données dans un fichier car les fonctions fputs() et fgets() ne
veulent pas prendre des tableaux de charactères non signés comme
paramètres :


Je n'arrive pas à déterminer ton problème. D'un côté, tu manipules un
fichier texte (modes "w" ou "r", utilisation de fputs et fgets). De l'autre,
tu sembles manipuler des données binaires (tableaux de non-signés).

Que veux-tu réellement ?

Si c'est manipuler des données binaires, il est plus facile d'ouvrir avec
"wb"/"rb", et d'utiliser fwrite/fread.

D'autre part, je suis surpris que ton compilateur te délivre des *erreurs*:
ce code est en effet sensé fonctionner (en C).


Antoine

Avatar
Jan
Antoine Leca wrote:
En , Jan va escriure:

j'ai un petit problème avec un code simple qui écrit et lit des
données dans un fichier car les fonctions fputs() et fgets() ne
veulent pas prendre des tableaux de charactères non signés comme
paramètres :


Je n'arrive pas à déterminer ton problème. D'un côté, tu manipules un
fichier texte (modes "w" ou "r", utilisation de fputs et fgets). De l'autre,
tu sembles manipuler des données binaires (tableaux de non-signés).

Que veux-tu réellement ?

Si c'est manipuler des données binaires, il est plus facile d'ouvrir avec
"wb"/"rb", et d'utiliser fwrite/fread.

D'autre part, je suis surpris que ton compilateur te délivre des *erreurs*:
ce code est en effet sensé fonctionner (en C).


Oui merci pour votre réponse, en réalité j'étais en train de coder en
C++, j'ai testé le même code en C et ça fonctionne...


Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Jan wrote:

j'ai un petit problème avec un code simple qui écrit et lit des données
dans un fichier car les fonctions fputs() et fgets() ne veulent pas
prendre des tableaux de charactères non signés comme paramètres :

const unsigned char string1[] = { 168, 21, 242, 190, 155, 24, 5, 165};
unsigned char string2[8];

fp=fopen("file.txt","w");
fputs(string1,fp); //écriture dans le fichier


Ca commence mal !

Le premier paramètre de fputs() doit être une chaine C valide. Ce n'est pas
le cas de string1 qui est un tableau de char initialisé, mais qui ne contient
aucun 0. Ce qui est écrit dans le fichier est donc une séquence de caractères
indéterminée.

Correction :
const unsigned char string1[] = { 168, 21, 242, 190, 155, 24, 5, 165, 0};

(La taille est donc de 9 caractères)

http://mapage.noos.fr/emdel/init_c.htm#string

Nota : en mode texte, le zéro final n'est pas enregistré dans le fichier. Ce
n'est qu'un délimiteur traité en amont.

fclose(fp);

fp=fopen("file.txt","r");
fgets(string2,8,fp); //lecture dans le fichier


Dans un fichier texte, on est censé lire des lignes (surtout avec fgets()!).
Ce qui a été écrit n'est pas une ligne complète. C'est pas très grave, mais
c'est pas très cohérent...

Le '8' indique que la chaine ne doit pas dépasser 7 caractères utiles (+ le
0). Ce n'est probablement pas ce que tu veux.

fclose(fp);

A la compilation (avec gcc) j'ai les erreurs suivantes pour fputs() et
fgets() respectivement :
invalid conversion from `const unsigned char*' to `const char*'
invalid conversion from `unsigned char*' to `char*'


Des erreurs ? Est-tu sûr d'invoquer le compilateur C ? Ou alors, tu as activé
-Werror...

Dans ce cas précis, un cast n'est pas dangereux (la taille unitaire de
l'objet pointé est identique).

Quelles possibilités ai-je pour pouvoir écrire et lire ces données avec
un type unsigned ? J'ai essayé de faire des conversions du genre
fputs((unsigned char*)string2,fp) mais sans résultats...


Evidemment, puisque tu n'as rien changé!

fputs((char *) string1, fp);

fgets((char *) string2, sizeof string2, fp);

Par contre, le warning est là pour te rappeler quand même que tu es censé
utiliser des tableaux de char (qui sont faits pour accueillir les chaines de
caractères) avec les fonction de flux 'orientées textes' (fgets() / fputs()
/ fprintf()).

Les flux binaires étant plutôt traités par fread()/ fwrite(), et là,
curieusment, les pointeurs deviennent anonymes (void *). Ce n'est sans doute
pas par hasard!

Est-tu bien sûr de ce que tu veux faire (texte ou binaire ?)

http://mapage.noos.fr/emdel/notes.htm#fichiers

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Jan wrote:

Oui merci pour votre réponse, en réalité j'étais en train de coder en
C++, j'ai testé le même code en C et ça fonctionne...


Non. On code en 'n'importe quoi' (ce n'est que du texte). C'est le
compilateur qui décide si c'est C++ ou du BASIC ou rien du tout!

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/