C/C++ Fread (windows)

Fermé
Ag2X Messages postés 37 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 20 avril 2012 - 2 juin 2005 à 14:10
mamiemando Messages postés 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 - 3 juin 2005 à 13:38
Bonjour,
alors, je suis pas un initié mais j'essaye de faire un petit prog simple, un genre de xcopy, j'en suis encore loin, pour le moment j'ai juste fé qqchose de tres basique:
int main(void) {

	char *src,*dest; //chaine pour set les chemins de fichier..
	FILE *s,*d;//pointeurs sur les fichier pour les fonction f...
	src = "H:\\source.mp3";//fichier source
	dest = "F:\\Dest.mp3";//fichier de destination
	s = fopen(src,"rb");//ouverture des 2 fichiers
	d = fopen(dest,"wb");
	if (s == NULL || d == NULL) { // verif d'erreur d'ouverture
		cout << "Erreur d'ouverture de fichier...";
		return 0;
	}
	else {
		char *r; unsigned int t,i = 0;
		r = (char*) malloc(1);
		while (1) { //boucle pour lire le fichier byte par byte et le copier
			i++;
			t = GetTickCount();
			fread(r,1,1,s);
			if (ferror(s)) {
				*r = '0';
				printf("ReadError... Pos: %u Tps: %u ms\n",i,GetTickCount() - t);
			}
			fwrite(r,1,1,d);
			if (feof(s)) break;
		}
		fclose(s); fclose(d); free(r);
		return 0;
	}
}

(tout les commentaires constructifs sont les bienvenu ;)
j'utilise visual studio 6
je cherche un moyen de reduire le temps entre un fread et le ferr...
je m'explique, je lis à partir du cdrom, je cherche juste a recuperé des fichiers dont certain bytes sont illisible, et de les remplace par des 0 dans la copie.
Seulement, entre fread et ferr, il se passe environ 20 à 25sec... donc si un fichier contient 200 octets illisibles (et parfois +) vous imaginez le temps que çà prend pour copier 1 fichier. (et j'ai bokou de fichier dans ce cas)

je voudrais des reponses constructives...
s'il y a besoin d'info demandez moi :)

@bientot
A voir également:

6 réponses

Vu que tu as deco, j'ai penser a faire une recherche dans les bibliotheques pour voir si ya pas une histoire de timeout.

Sinon il ce peu aussi que ce soit le fait que le lecteur insite avant de dir que le secteur est ilisible donc la tu peux rien y faire (le lecteur fait du bruit a ce moment ^^)

Chao
0
mamiemando Messages postés 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 7 749
2 juin 2005 à 17:29
Euh c'est peut être moi qui est fumé mais tu ne peux pas utiliser directement les flux sur les fichiers (cf <fstream.h>), avec l'opérateur "<<" ?
0
blurk Messages postés 486 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 15 mars 2009 160
2 juin 2005 à 17:52
bonjour !

Il y a quelques petites choses qui à mon avis posent problème

src = "H:\\source.mp3";


a éviter absolument avec les chaines de caractères
cela de marche que lors de la déclaration de la chaine
et ça limite la taille de la chaine à ce qui a été mis dedans au départ
==>pas réutilisable

utiliser plutôt
strcpy(destination, source);


on peut aussi par exemple déclarer src comme suit :
char src[100];

ce qui lui alloue un espace capable de contenir 99 caractères
pas besoin de faire free(src) à la fin.

fread(r,1,1,s);
fwrite(r,1,1,d);


on utilise généralement ces fonctions avec des structures
dont on connait la taille.

pour les caractères, il est plus simple d'utiliser
en lecture :
r[index]=fgetc(s);

en écriture :

fputc(r[index], d);


où index est un entier qui incrémente dans une boucle tant que
!feof(s);


cordialement, et bon courage
0
Ag2X Messages postés 37 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 20 avril 2012
2 juin 2005 à 17:55
oui possible mamiemando, mais j'y connais pas grand chose en prog... donc je fait comme je peut...
tu pourrais me donner un exemple d'utilisation de "<<" en reprenant mon principe, ou pas, c toi ki vois...
je sais pas si çà changerais le temps pour le erreur...
0

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

Posez votre question
Ag2X Messages postés 37 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 20 avril 2012
2 juin 2005 à 18:17
à merci blurk pour les remarques j'essayerais de voir si je peux faire qqchose de plus propre avec çà...

mais, il y a toujours un mais :o) le pb viens surtout de la durée entre une tentative de lecture et l'erreur qui en resulte...

je voudrais pouvoir definir ce parametre... :/
0
mamiemando Messages postés 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 7 749
3 juin 2005 à 13:38
Voilà pour les bases.

http://www.cplusplus.com/ref/iostream/ostream/operatorltlt.html

Je me demande si be tu peux pas faire directement dest<<source avec dest un ofstream et source un ifstream... A vérifier ;)

<< ajoute ce qu'il y a à droite dans ce qui est à gauche (dest<<source). Exemple d'utilisation : écriture (d'un fichier comme stdout par exemple appelé en c++ std::cout)

>> extrait ce qu'il y a gauche vers ce qui est à droite (source>>dest)
Exemple d'utilisation : lecture d'un fichier (par exemple stdin, appelé en c++ std::cin)

Bonne chance ;)

Rq : pour les sorties standards (stderr et stdout) et l'entrée standard, on n'utilise pas <fstream> mais <iostream>
Rq2: ne pas mettre le ".h" dans le #include pour les headers c++:
Ex : on ne met pas #include <iostream.h> mais #include <iostream>
0