Problème de copie de fichier en c !!!!

Problème de copie de fichier en c !!!! - Programmation

Marsh Posté le 03-12-2001 à 17:24:29    

Voila le problème
 
j'ouvre un fichier en lecture et un autre en écriture.
je lis le fichier en lecture avec fread et le copie dans l'autre avec fwrite.Le fichier en lecture est de 20k mais le fichier en ecriture n'as que 7 octet pas rapport.
Après je ferme les fichiers avec fclose.
 
Quel peut etre le problème????

Reply

Marsh Posté le 03-12-2001 à 17:24:29   

Reply

Marsh Posté le 03-12-2001 à 18:32:36    

montre ton code svp

Reply

Marsh Posté le 04-12-2001 à 10:07:44    

peut-être que tu ouvres tes fichiers en mode texte...
j'ai deja fait ce genre de bêtises. ça te remplace tous les octets valant 10 ou 13 par 2 octets valant 10 et 13 (\n).


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 04-12-2001 à 11:52:04    

Utilise plutot la fct fgets pour lire caractere par caractere.
J' usqu' à la fin du fichier.( WHILE !FEOF(Fint))
100 pour cent efficace.

Reply

Marsh Posté le 04-12-2001 à 11:53:25    

bouteilledo a écrit a écrit :

Utilise plutot la fct fgets pour lire caractere par caractere.
J' usqu' à la fin du fichier.( WHILE !FEOF(Fint))
100 pour cent efficace.  




 
?
 
copie un fichier de 100Mo avec cette methode, t pas couche :D

Reply

Marsh Posté le 04-12-2001 à 12:35:20    

si c'est un fichier binaire et non pas texte ça va sûrement foirer avec fgets :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 04-12-2001 à 12:42:36    

exact !
essaye d'utiliser fread octet par octet.
et surtout, ouvre ton fichier en mode binaire !

 

[edtdd]--Message édité par Pitounet--[/edtdd]

Reply

Marsh Posté le 04-12-2001 à 12:52:42    

Pitounet a écrit a écrit :

exact !
essaye d'utiliser fread octet par octet.
et surtout, ouvre ton fichier en mode binaire !  
 
 




 
octet par octet ?
 
Heuh non, mieux vaut lire des blocs d'un coup....

Reply

Marsh Posté le 04-12-2001 à 13:13:01    

mais si tu fais ça, il faut vérifier à chaque fois le nombre d'octets effectivement lus. Sinon, tu peux te retrouver avec un fichier de sortie plus gros que le fichier d'entrée.

Reply

Marsh Posté le 04-12-2001 à 13:15:15    

bah c pas la mere a boire hein ?
 
un truc du genre
 
 
//ouverture de fichier in et out
 
char buffer[5000];
 
int val;
 
while(1)
{
 val = fread(buffer,5000,1,in);
 val = fwrite(buffer,val,1,out);
 if (val !=5000)
   break;
}

Reply

Marsh Posté le 04-12-2001 à 13:15:15   

Reply

Marsh Posté le 04-12-2001 à 13:17:37    

bouh le vieux break [:kaola]

Reply

Marsh Posté le 04-12-2001 à 13:20:11    

Godbout a écrit a écrit :

bouh le vieux break [:kaola]  




nanananareuuuhhhh !
 
(j'ai fais au plus vite, rooohhhh)

Reply

Marsh Posté le 04-12-2001 à 13:21:06    

Pour une fois je vais essayer d'eviter tes conseils :D

Reply

Marsh Posté le 04-12-2001 à 13:22:16    

//ouverture de fichier in et out
 
char buffer[5000];
 
int val;
bool pasBoLeBreak= true;
while(pasBoLeBreak)
{
val = fread(buffer,5000,1,in);
val = fwrite(buffer,val,1,out);
if (val !=5000)
  pasBoLeBreak= false;
}  
 
 
 
heureux ? :D

Reply

Marsh Posté le 04-12-2001 à 13:23:24    

T'aurais quand meme pu trouver un peu plus beau comme nom de variable :D

Reply

Marsh Posté le 04-12-2001 à 13:24:22    

Godbout a écrit a écrit :

T'aurais quand meme pu trouver un peu plus beau comme nom de variable :D  




 
c'est du code, pas de la poesie :D
(a moins que tu ne codes en Alexandrin ?)

Reply

Marsh Posté le 04-12-2001 à 13:32:09    

:lol::lol:

Reply

Marsh Posté le 04-12-2001 à 13:36:36    

chrisbk a écrit a écrit :

//ouverture de fichier in et out
 
char buffer[5000];
 
int val;
bool pasBoLeBreak= true;
while(pasBoLeBreak)
{
val = fread(buffer,5000,1,in);
val = fwrite(buffer,val,1,out);
if (val !=5000)
  pasBoLeBreak= false;
}  
 
 
 
heureux ? :D  



:lol:

Reply

Marsh Posté le 04-12-2001 à 14:08:35    

chrisbk a écrit a écrit :

//ouverture de fichier in et out
 
char buffer[5000];
 
int val;
bool pasBoLeBreak= true;
while(pasBoLeBreak)
{
val = fread(buffer,5000,1,in);
val = fwrite(buffer,val,1,out);
if (val !=5000)
  pasBoLeBreak= false;
}  
 
 
 
heureux ? :D  




Si c'est pour l'ecrire comme ca, autant mettre un break :D
 
moi je prefere :
 
 
#define BLOCK_SIZE 5120
char buffer[BLOCK_SIZE ];
 
int val;
do
{
   val = fread(buffer,BLOCK_SIZE ,1,in);  
   val = fwrite(buffer,val,1,out);
}
while (val == BLOCK_SIZE);

Reply

Marsh Posté le 04-12-2001 à 14:10:29    

BENB a écrit a écrit :

 

Si c'est pour l'ecrire comme ca, autant mettre un break :D





 
Ben vi, c'est ce qu'il avait fait juste au dessus le saligaud :D

Reply

Marsh Posté le 04-12-2001 à 14:12:45    

BENB a écrit a écrit :

 
Si c'est pour l'ecrire comme ca, autant mettre un break :D
 
moi je prefere :
 
 
#define BLOCK_SIZE 5120
char buffer[BLOCK_SIZE ];
 
int val;
do
{
   val = fread(buffer,BLOCK_SIZE ,1,in);  
   val = fwrite(buffer,val,1,out);
}
while (val == BLOCK_SIZE);  




 
Je sais :sweat:  
mais certains sont allergiques au break, aussi petit soit il (c quand meme pas dramatique, enfin, t'en qu'yen a pas 300x / boucles.... )
 
La prochaine fois je fais un goto :na:
 
en tout ca ta version est plus propre, quand meme :D
 
 
(gb : je t'en foutrais moi, des saligauds :D )

Reply

Marsh Posté le 04-12-2001 à 14:13:58    

Godbout a écrit a écrit :

 
 
Ben vi, c'est ce qu'il avait fait juste au dessus le saligaud :D  




J'avais vu :D...
mais j'avoue ne pas avoir ete convaincue par la transformation operee...  
Mais il faut reconnaitre que etant le premier a avoir donne un bout de code, il avait bien le droit de nous donner un brouillon exposant le principe de sa pensee...

Reply

Marsh Posté le 04-12-2001 à 14:14:46    

Ben c'est sur, c'est pour le charier, surtout que c'est pas moi qui vait lui apprendre des trucs ;) (d'ailleurs j'apprends rien a personne moi :D).

Reply

Marsh Posté le 04-12-2001 à 14:15:41    

pour etre complet, la version godbout :
 
 
while(1)
{
 val = fwrite(buffer,fread(buffer,5000,1,in),1,out);
 if (val != 5000)
    goto fin;
}
fin:

Reply

Marsh Posté le 04-12-2001 à 14:17:11    

:lol::lol::lol:

Reply

Marsh Posté le 04-12-2001 à 14:18:02    

while(1)
{
 val = fwrite(fread(buffer,5000,1,in),strlen(fread(buffer,5000,1,in)),1,out);
 if (val != 5000)
    goto fin;
}
fin:
 
:lol::lol:

 

[edtdd]--Message édité par Godbout--[/edtdd]

Reply

Marsh Posté le 04-12-2001 à 14:19:33    

Godbout a écrit a écrit :

while(1)
{
 val = fwrite(fread(buffer,5000,1,in),strlen(fread(buffer,5000,1,in)),1,out);
 if (val != 5000)
    goto fin;
}
fin:
 
:lol::lol:  
 
 




 
:non:
 
marche pas, strlen sur un fichier binaire ca va pas aller
 
par contre
 
 
while(fwrite(buffer,fread(buffer,5000,1,in),1,out)!= 5000);
 
ca c bien :D

Reply

Marsh Posté le 04-12-2001 à 14:20:21    

ah merde, fichier binaire, trop complique pour moi :D

Reply

Marsh Posté le 04-12-2001 à 14:20:43    

chrisbk a écrit a écrit :

pour etre complet, la version godbout :
 
 
while(1)
{
 val = fwrite(buffer,fread(buffer,5000,1,in),1,out);
 if (val != 5000)
    goto fin;
}
fin:  




Oui, mais alors :
 
for(;fwrite(buffer,fread(buffer,5000,1,in),1,out) != 5000;);
 
c'est la version qui ???

Reply

Marsh Posté le 04-12-2001 à 14:21:39    

Flute, grillee... :lol:

Reply

Marsh Posté le 04-12-2001 à 14:23:02    

en plus c plus joli avec while
 
 
Benb, pour bien comprendre pkoi g appele ca la version godbout, je te propose de jeter un oeil sur le bout de source suivant, copyright godbout:
 
strcpy(ATableau[lignTableau][16].chaine, Format(atof(strcat(Val(ATableau[lignTableau][21].chaine), "000" )), "00000" ));
 
 
(de l'aveu de l'auteur, il a ete raccourci pour pas flinguer la mise en page du forum :D )
 
alors quand tu vois qu'ensuite il vient chipoter pour un break :sarcastic: :D

Reply

Marsh Posté le 04-12-2001 à 14:24:26    

Faut remettre dans le contexte aussi, c'etait y a 2 mois, fallait que je repompe un code vb en C++, en 1 semaine.
Je captais rien entre les dll, le C++, etc...
 
Bref pour copier, ben j'ai copie :D

Reply

Marsh Posté le 04-12-2001 à 14:30:27    

:lol:    
J'ai vu des codages de cochons...  
Mais la je pense que le recoursissement est dommageable...
 
Si tu as la version Complete Godbout, donne la moi... :D
 
Sisi je vais devoir faire un manuel de regles de codage...
 
...ca me parait un bon exemple de ce qu'il ne faut pas faire :D

Reply

Marsh Posté le 04-12-2001 à 14:32:59    

ça vaut pas ceci que j'avais fait y a qques mois:
1 ligne de code, elle fonctionnait, mais par après j'ai quand même optimisé le truc avec des with et variables temporaires. Il s'agit d'une simple assignation :D
 

Code :
  1. (ProjectsList.RTItems.Objects[FindProjectIndex(ProjectsList.RTItems, (TimeSheetRows.Nodes[RowNum-1] as TTimeSheetRow).Project)] as TProject).Tasks.Index := FindTaskIndex((ProjectsList.RTItems.Objects[FindProjectIndex(ProjectsList.RTItems, (TimeSheetRows.Nodes[RowNum-1] as TTimeSheetRow).Project)] as TProject).Tasks.RTItems, (TimeSheetRows.Nodes[RowNum-1] as TTimeSheetRow).Task);


 
(je sais c'est pas du C c'est du Pascal)

 

[edtdd]--Message édité par antp--[/edtdd]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 04-12-2001 à 14:33:05    

[:sisicaivrai]
 
zetes pas gentils [:sisicaivrai]
 
Maintenant ca ressemble plutot a ca, pas tres joli mais bon...
 
resMid = Mid(value, 1, 4);
 
//Maybe an option mobalpa ?
if (strcmp(resMid, "OPT-" ) == 0)
{
 FREE(resMid);
 
 lignSupp++;
 strcpy(ATableau[lignTableau][0].chaine, "O" );
     
 resFormat = Format(lignN, "000" );
 strcpy(ATableau[lignTableau][2].chaine, resFormat);
 FREE(resFormat);

Reply

Marsh Posté le 04-12-2001 à 14:33:54    

benb : la version complete est dans un topic de +100 pages, ca va etre chod a trouver :D

Reply

Marsh Posté le 04-12-2001 à 14:34:05    

Au fait la dll fonctionnait tres tres bien sur un PIII 1ghz, 512 de ram je vous signale :D

Reply

Marsh Posté le 04-12-2001 à 14:36:14    

Godbout a écrit a écrit :

Au fait la dll fonctionnait tres tres bien sur un PIII 1ghz, 512 de ram je vous signale :D  




Une brouette, quoi ?
1 seul proc je suppose ?

Reply

Marsh Posté le 04-12-2001 à 14:38:34    

ouais un seul proc, ca ramait un peu mais ca vient du 19", sisi c'est vrai !! :D

Reply

Marsh Posté le 04-12-2001 à 14:40:48    

(arreter de faire les malins avec vos engins, faire de la 3d sur P450 c relou grave)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed