Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

A propos des accents en C

2 réponses
Avatar
Tanoor
Bonjour,
je dois d=E9velopper une application cliente en C qui se connecte =E0 un
serveur, et lui envoie le contenu d'un fichier texte.

Pour cela, je cr=E9e une socket et j'envoie "N" octets au serveur(N
=E9tant la taille de mon fichier). L'ennuie est que mon fichier
comporte des accents. Du coup, le nombre de caract=E8res de mon fichier,
ne correspond pas au nombre d'octets de celui-ci.

write(socket, mon_buffer, la_taille_de_mon_buffer);

Ma question est donc la suivante: comment faire en sorte d'envoyer
exactement le nombre d'octets correspondant =E0 mon fichier.

Merci d'avance,
foodige.

2 réponses

Avatar
Samuel Devulder
Tanoor a écrit :
Bonjour,
je dois développer une application cliente en C qui se connecte à un
serveur, et lui envoie le contenu d'un fichier texte.

Pour cela, je crée une socket et j'envoie "N" octets au serveur(N
étant la taille de mon fichier). L'ennuie est que mon fichier
comporte des accents. Du coup, le nombre de caractères de mon fichier,
ne correspond pas au nombre d'octets de celui-ci.

write(socket, mon_buffer, la_taille_de_mon_buffer);

Ma question est donc la suivante: comment faire en sorte d'envoyer
exactement le nombre d'octets correspondant à mon fichier.

Merci d'avance,
foodige.



Je ne comprends pas.. un fichier est un fichier.. Si ton fichier fait
1024 octets sur disque, alors je ne vois pas pourquoi il faudrait
transmettre 1024+quelquechose sur la socket.

Comment détermine tu la taille du fichier à transmettre?

Tu utilises stat() ou un comptage lettre à lettre?

Si c'est un comptage lettre à lettre avec un encodage spécifique (utf-8
par exemple) et une API dédiée, il faut savoir que tu peux recevoir 1
seule lettre de l'api alors qu'on en a lu plusieurs sur disk. Le
comptage est donc nécessairement faux!

Similairement si tu tu veux envoyer un texte dans un autre encodage que
celui de ton fichier disque, il se peut qu'un char disk se traduise par
plusieurs chars dans l'encodage attendu par le destinataire.

==> Bref il faut tenir compte de l'encodage lors des échanges entre
octets et lettres.

Dans les langages plus récent (java par ex) on distingue les bytes
(octets) des char (lettres) car les deux ne sont pas équivalents et
chacun a son API de fichier dédiée (stream pour les bytes, et writer
pour les char en gros).

sam.
Avatar
Tanoor
On 29 jan, 23:25, Samuel Devulder
wrote:
Tanoor a écrit :



> Bonjour,
> je dois développer une application cliente en C qui se connecte à u n
> serveur,  et lui envoie le contenu d'un fichier texte.

> Pour cela, je crée une socket et j'envoie "N" octets au serveur(N
> étant la taille de mon fichier). L'ennuie est que  mon fichier
> comporte des accents. Du coup, le nombre de caractères de mon fichier ,
> ne correspond pas au nombre d'octets de celui-ci.

> write(socket, mon_buffer, la_taille_de_mon_buffer);

> Ma question est donc la suivante: comment faire en sorte d'envoyer
> exactement le nombre d'octets correspondant à mon fichier.

> Merci d'avance,
> foodige.

Je ne comprends pas.. un fichier est un fichier.. Si ton fichier fait
1024 octets sur disque, alors je ne vois pas pourquoi il faudrait
transmettre 1024+quelquechose sur la socket.

Comment détermine tu la taille du fichier à transmettre?

Tu utilises stat() ou un comptage lettre à lettre?

Si c'est un comptage lettre à lettre avec un encodage spécifique (utf -8
par exemple) et une  API dédiée, il faut savoir que tu peux recevoi r 1
seule lettre de l'api alors qu'on en a lu plusieurs sur disk. Le
comptage est donc nécessairement faux!

Similairement si tu tu veux envoyer un texte dans un autre encodage que
celui de ton fichier disque, il se peut qu'un char disk se traduise par
plusieurs chars dans l'encodage attendu par le destinataire.

==> Bref il faut tenir compte de l'encodage lors des échanges entre
octets et lettres.

Dans les langages plus récent (java par ex) on distingue les bytes
(octets) des char (lettres) car les deux ne sont pas équivalents et
chacun a son API de fichier dédiée (stream pour les bytes, et writer
pour les char en gros).

sam.



Salut Sam,
je n'ai pas dû être clair mais tu as quand même répondu à ma
question :)
En fait, effectivement, je faisais un comptage lettre à lettre. Je
savais que c'était l'origine de mon problème mais je ne savais pas
comment le résoudre.
Je ne connaissais tout simplement pas la fonction stat.
Avec cette fonction, mon problème est réglé.

Merci beaucoup,
Tanoor.