Fopen()

cs_JCpp Messages postés 334 Date d'inscription samedi 12 janvier 2002 Statut Membre Dernière intervention 3 juillet 2010 - 4 sept. 2003 à 20:23
abdoulax Messages postés 875 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 22 juin 2012 - 5 sept. 2004 à 02:14
Je voudrai réaliser la même méthode que « Anacr0x »,
qui consiste à lire et écrire dans un fichier.

Je reprends la même chose que « Anacr0x », qui permet de lire un fichier :
http://www.cppfrance.com/forum.aspx?Article=16355

char buf2[1024+1];
FILE *FichierEnvoi = fopen("c:\\MsgBox.ico", "rb");

char TailleChar[100];

DWORD Taille=TailleFichier("c:\\MsgBox.ico");
sprintf(TailleChar,"%d",Taille);

while(!feof(FichierEnvoi))
{
fread(buf2,1024,1,FichierEnvoi);
}
fclose(FichierEnvoi);

La deuxième partie pour l’enregistrement me pose des pb,
qui consiste à enregistrer le contenu de buf2.

« Anacr0x », utilise :
int FichierRecu = open(chaine, _O_CREAT | _O_WRONLY | _O_BINARY, 0755);
et “write » et « close » que mon compilateur n’accepte pas

Donc, j’ai modifié,
mon pb c’est que ça n’enregistre pas tout, et c’est même pas le début, ni la fin du fichier.
FILE *FichierRecuFichierRecu fopen("c:\\MsgBox2.ico", "wb");
char buf[1024+1];

while(Taille > 0)
{
fwrite (buf2 , 1 ,strlen(buf2) , FichierRecu);
Taille = Taille - 1;
}
fclose(FichierRecu);

Je ne suis vraiment pas doué avec « fopen », et surtout avec « fread », « fwrite ».

Merci d’avance de consacré un peux de temps pour mon pb

14 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
4 sept. 2003 à 20:39
Salut,
Et ton buffer tu le remplis jamais avant d'essayer de l'ecrire dans un fichier ?
Et dans fwrite, il faut ecrire le nombre d'octet que tu recois (valeur retournée par recv(...) et non strlen(Buf).
0
cs_JCpp Messages postés 334 Date d'inscription samedi 12 janvier 2002 Statut Membre Dernière intervention 3 juillet 2010
4 sept. 2003 à 21:00
j'ai bien le contenu du fichier dans buf2.
j'ai toujours le mm pb, je n'arive pas à enregister le contenu de buf2
FILE *FichierRecuFichierRecu fopen("c:\\MsgBox2.ico", "wb");

while(Taille > 0)
{
fwrite (buf2 , Taille , 1, FichierRecu);
Taille = Taille - 1;
}
fclose(FichierRecu);
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
4 sept. 2003 à 21:03
Pour ton serveur (ou client) qui envoi le fichier, utilise ca :
DWORD TailleFichier(char *fichier)
{      
 DWORD TFichier = 0;
 HANDLE hfl = CreateFile(fichier, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 
 FILE_FLAG_SEQUENTIAL_SCAN, NULL);
 // Donne la taille en octet
 TFichier = (GetFileSize(hfl, 0));
 CloseHandle(hfl);
 return TFichier;
}

char *CheminFichier = "C:\\fichier.exe"; // a modifié

// On crée le buffer et on ouvre le fichier en binaire
char buf2[1024+1];
FILE *FichierEnvoi = fopen(CheminFichier, "rb");    
           
// On envoi la taille du fichier
char TailleChar[100];
DWORD Taille=TailleFichier(CheminFichier);
sprintf(TailleChar,"%d",Taille);
     
sockwrite(Client, TailleChar);
        
// On envoi le fichier tant qu'on est pas a la fin
while(!feof(FichierEnvoi))
     { 
      memset(buf2, 0, sizeof(buf2));
      fread(buf2,1024,1,FichierEnvoi);   
      send(Client,buf2,1024,0); 
     }                                   
// On le ferme
fclose(FichierEnvoi); 


et pour le récepteur, ca :
// Crée le fichier en mode binaire
FILE *FichierRecu = fopen("C:\\lefichierketuveu.exe", "ab");

char buf[1024+1];                                                                         
memset(buf, 0, sizeof(buf));
// On réceptionne la taille du fichier
recv(Client, buf, sizeof(buf), 0);  
            
// On la transforme en int
int taille = atoi(buf);

unsigned int n;
// Tant qu'on est pas arrivé a la taille du fichier on receptionne les données
while(taille > 0)
        {
         memset(buf, 0, sizeof(buf));
         n = recv(Client, buf, sizeof(buf), 0);  
         // On écrit dans le fichier
         fwrite(buf, n, 1, FichierRecu);
         taille = taille - n;
        }                
// On ferme le fichier
fclose(FichierRecu);   


Voila, je pense que je n'ai rien oublié, en cas de pb, n'hésite pas a demandé
J'espere que ca t'as aidé, @+
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
4 sept. 2003 à 21:09
Salut,
Poste tout ton code ici.
La je vois aucun recv(...) qui rempli le buffer.
Le recv(...) doit etre dans la meme boucle que le fwrite(...).
Tu recois 1024 octets, tu ecris 1024 octets, tu recois 1024 octets, tu ecris 1024 octets, etc...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
4 sept. 2003 à 21:14
oups, petit oublie, remplace sockwrite(Client, TailleChar); par send(Client,TailleChar,strlen(TailleChar),0);
voila, ca devré allé un peu mieu
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
4 sept. 2003 à 21:16
Salut,
Honnetement je pense que copier un bout de code sans chercher a resoudre son probleme est pas très utile.
Sinon je vais quand meme faire une remarque constructive (:p):
Pourquoi utilise tu CreateFile() et CloseHandle() dans TailleFichier() et ensuite fopen(), fread() et compagnie ?
Tu devrais tout faire avec CreateFile(), ReadFile() et CloseHandle().

Un dernier truc, le sprintf(TailleChar,"%d",Taille); que tu peux remplacer par ultoa(...), bcp mieux.
0
cs_JCpp Messages postés 334 Date d'inscription samedi 12 janvier 2002 Statut Membre Dernière intervention 3 juillet 2010
4 sept. 2003 à 21:24
je teste le code "Anacr0x".
g po encore réuci!
Un fichié ce crée, mai il y a po tout
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 sept. 2003 à 21:27
C'est quoi ce bordel de code, excusez le mot mais on accede aux fichiers un coup en win32, un coup avec des flux, et sera quoi la prochaine. Si on code pour win32 on s'y tient, c'est WriteFile pour ecrire sinon on fait tout en fluflux.
BruNews, ciao...
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
4 sept. 2003 à 21:35
Pour aardman :
Tu as sans doute raison, mais il manquait pas mal de précision dans sa question que j'ai préféré lui donné la réponse entière et construite... Après, je pense que le code n'est pas trè dure a comprendre et de plus je l'ai commenté... En cas d'un quelconque pb de compréhension, qu'il n'hésite pas a me demandé a moi ou a quelqu'un d'autre, je lui répondrait... (Et puis j'avais tt le code sous la main, ca a été rapide pour moi (^_^) )

Sinon, pour CreateFile et fopen, j'utilise principalement fopen tellement jsui habitué a cette technique mais la j'ai du me servir de CreateFile pour utilisé la commande GetFileSize, je n'ai pas trouver d'autre moyen avec fopen donc...

Pour ultoa, je regarde ca et je change, merci

pour BruNews :
Idem que pour aardman, j'aurait préféré garder mes bon vieux fopen que j'ai l'habitude de manipuler mais a vrai dire j'ai pas trouver d'autre technique qu'avec CreateFile...
C'est sans doute pas parfait mais ca a au moin le mérite de marcher (^_^)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 sept. 2003 à 21:40
Ben quand c'est juste pour la taille tu te sers de FinFirstFile.
BruNews, ciao...
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
4 sept. 2003 à 22:27
FindFirstFile et utoa marche nikel, merci
0
Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
4 sept. 2003 à 22:34
Ca marche toujour pas ? ya un problème la, j'ai déja testé ce code plus d'une fois sans aucun problème...

Moi quand j'avais pas tt, c'est que j'avais mis des strlen quelque par ou il fallait pas, regarde de ce coté (les strlen coupe la chaine au premier zero binaire rencontré, et yen a plin ds un fichier binaire...)
0
cs_JCpp Messages postés 334 Date d'inscription samedi 12 janvier 2002 Statut Membre Dernière intervention 3 juillet 2010
4 sept. 2003 à 23:05
re,

comme tu m’aide bcp, je n’hésiteras pas à consacrer du tps pour t’aider, ci tu as besoin un jour.

Encore merci.
0
abdoulax Messages postés 875 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 22 juin 2012 1
5 sept. 2004 à 02:14
Pour la taille y a une autre manière :

fd = fopen(fichier, "rb");
long size;
fseek(fd, 0, SEEK_END);
size = ftell(fd);
fseek(fd, 0, SEEK_SET);
0
Rejoignez-nous