Problème de copie de fichier en c !!!! - Programmation
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).
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.
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
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
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]
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....
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.
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;
}
Marsh Posté le 04-12-2001 à 13:20:11
Godbout a écrit a écrit : bouh le vieux break |
nanananareuuuhhhh !
(j'ai fais au plus vite, rooohhhh)
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 ?
Marsh Posté le 04-12-2001 à 13:23:24
T'aurais quand meme pu trouver un peu plus beau comme nom de variable
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 |
c'est du code, pas de la poesie
(a moins que tu ne codes en Alexandrin ?)
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 ? |
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 ? |
Si c'est pour l'ecrire comme ca, autant mettre un break
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);
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 |
Ben vi, c'est ce qu'il avait fait juste au dessus le saligaud
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 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
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
en tout ca ta version est plus propre, quand meme
(gb : je t'en foutrais moi, des saligauds )
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 |
J'avais vu ...
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...
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 ).
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:
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:
[edtdd]--Message édité par Godbout--[/edtdd]
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: |
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
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 ???
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 )
alors quand tu vois qu'ensuite il vient chipoter pour un break
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
Marsh Posté le 04-12-2001 à 14:30:27
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...
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
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
Code :
|
(je sais c'est pas du C c'est du Pascal)
[edtdd]--Message édité par antp--[/edtdd]
Marsh Posté le 04-12-2001 à 14:33:05
zetes pas gentils
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);
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
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
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 |
Une brouette, quoi ?
1 seul proc je suppose ?
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 !!
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)
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????