Posez votre question Signaler

C/C++ Fread (windows)

Ag2X 11Messages postés 16 décembre 2002Date d'inscription - Dernière réponse le 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
Lire la suite 

C/C++ Fread (windows) »

Suggestions
6 réponses
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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 "<<" ?
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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...
Ajouter un commentaire
Réponse
+0
moins plus
à 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... :/
Ajouter un commentaire
Réponse
+0
moins plus
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>
Ajouter un commentaire
Ce document intitulé « C/C++ Fread (windows) » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
5 extensions si vous voulez revenir à l'ancien Facebook