comment copier caractère par caractère des données d'un fichier binaire dans un char * ??
j en ai besoin pour ma fonction segmentation et j'avoue que je desespère??
comment copier caractère par caractère des données d'un fichier binaire dans un char * ??
j en ai besoin pour ma fonction segmentation et j'avoue que je desespère??
Pourquoi pas tout simplement un fread ?
Si c'est caractère par caractère, fgetc() est tout indiqué. Si c'est par blocs de caractères (sans que l'on veuille que cela représente une chaine) => fread().Envoyé par angy_y
Exple avec fgetc() :
A+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #include <stdio.h> int main(void) { FILE * f = NULL; int cR; char c; f = fopen("machin.bin", "rb"); if (f) { while ( (cR = fgetc(f)) != EOF ) { c = cR; /* faire qqchose avec c */ } if (ferror(f)) { fprintf(stderr, "error while reading machin.bin!\n"); } fclose(f); } return 0; }
Envoyé par Foobar1329
mais je ne vois pas le rapport avec mon char*.. car j'ai mes données à envoyer dans mon Buff que j'ai déclaré ainsi :
char * Buff ;
RBuff = (512 * malloc sizeof(char));
File * sortie;
Comment faire avec fgetc pour copier caractère par caractère ( pour ne pas dépasser une taille précise )de sortie DANS mon Buff.. ????
Ta question est mal posée. Tu veux lire un fichier par bloc et l'envoyer avec send(), c'est ça ?Envoyé par angy_y
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 /* ouverture fichier et socket, connexion... */ char buffer[512]; size_t n; while ((n = fread (buffer, 1, sizeof buffer, fp)) != 0) { if (send (sock, buffer, n, 0) != n) { /* erreur de taille... */ } } /* fermeture */
Hello,
Drôle de nom "sortie" si c'est le fichier source des données.Envoyé par angy_y
C'est quoi ce (512 * malloc sizeof(char)); ?![]()
![]()
![]()
Tu multiplies l'adresse récupérée pour ton espace mémoire allouée par 512 !!
En gros, quand tu fais le free, si tout va bien (valeur de RBuff non modifiée), faut diviser par 512 avant![]()
RBuff = malloc(512 * sizeof*RBuff);
Signification : je veux de l'espace mémoire pour 512 objets de la taille de ce qui est pointée par RBuff, à savoir, 512 char. Par définition, sizeof(char) vaut 1, mais je n'aime pas remplacer les sizeof(char) par 1 cacr ça peut créer des ennuis le jour ou tu changes de type (exple: si je passe en wchar_t pour de l'internationalisation de code, je n'ai qu'à passer char * RBuff en wchar_t * RBuff sans toucher au malloc() ).
[/quote]Envoyé par angy_y
Hopala,
dans ce cas, c'est de la lecture par blocs avec fread() qu'il faut faire...
J'ai écrit un petit exemple l'autre jour ici :
http://www.developpez.net/forums/sho...66&postcount=4
Sinon si tu tiens à rempir uniquement RBuff caractère par caractère avec fgetc()...
exple: 512 premiers caracteres de ton fichier
Ne pas oublier stdlib.h ainsi que de traiter les cas où ca va pas bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 char * RBuff = NULL; FILE * entree = NULL; entree = fopen("bidule", "r" /* "rb" ptet ?*/); if (entree) { RBuff = malloc (512*sizeof*RBuff); if (RBuff) { int i, cLu; for(i=0; i < 512; ++i) { cLu = fgetc(entree); if (cLu == EOF) { break; } RBuff[i] = cLu; } /* faire qquchose */ free(RBuff); RBuff = NULL; } fclose(entree); entree=NULL; }
A+
Je vais etre plus clair. voila mon code de la fonction segmentation
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 #include <stdio.h> #include <stdlib.h> #include <string.h> #define mss 512; char * segmentation (....) { FILE *sortie; char *RBuff; RBuff = (mss * malloc (sizeof(char))); char BuffInter; long taille; long savepos; sortie =fopen("message_test","wb+"); // ouverture du fichier msg_test if (sortie=NULL) { fprintf("Erreur dans l'ouverture du fichier");//cas fichier Ã* envoyer exit(-1); } else { fprintf("sortie,"azertyuiopAZERTY"); savpos=ftell(sortie); fseek(sortie, 0, SEEK_END); taille=ftell(sortie); fseek(stream, long, SEEK_SET); return taille; while(fread(RBuff, sizeof(char),1,sortie),!feof(sortie)); //lecture { car=0; if (taille<=size || car<=mss) { fseek(sortie,sizeof(char),SEEK_SET); // positionne l indicateur pour la lecture fgetc(sortie); car++; // } // else // { // } } fclose(sortie); //fermeture fichier free (RBuff); }
Alors je m'occupe de la fonction segmentation.
Je télécharge un fichier en mode binaire et ensuite je dois le placer dans mon buffer ( RBuff) .
La taille de mes segments à envoyer au récepteur est de 512. Donc je dois lire mon fichier cara ctère par caractère ( si c'est la bonne méthode) et les placer dans le RBuff juska atteindre 512.
Ensuite, c'est la fonction send () qui, elle, envoie ces données.
Mais franchement, je ne sais pas si c'est vraiment du char* car je ne pige pas grand chose en C.. :-(
Alors commence par le commencement :Envoyé par angy_y
![]()
comment faut il faire now pour la fonction réassemblage dans le cas ou le client recoit des segments??
Pareil. Tu prévois un buffer de réception et tu écris dedans au fur et à mesure avec receive() et tu recopies sur le disque avec fwrite()...Envoyé par angy_y
Aucune difficulté particulière. Les sockets et les fonctions fichiers, c'est fait pour.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager