Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/01/2008, à 21:41

KindPLayer

Probleme de limitation ??

Bonjour

J'écris un programme qui simule des générateurs aléatoires. Je crée un fichier binaire ou jecris des octets, cela au sein d'une boucle faisait 10* la periode du generateur (rand). Mais bizarrement a l'issu de l'execution mon fichier ne fait que 512 Mo alors que j'attends 5Go. Encore plus bizarre quand je fais moins d'iterations, a savoir je fais juste periode iterations, donc 10 fois moins, le fichier grossit jusqu'a 2Go puis la j'ai un message Debordement de la taille maximale de fichier. Qui peut m'expliquer ce mystere ??

void ecrire_bin(unsigned long periode,int (*randFoncPtr)()){
	unsigned long i,p=1;
	unsigned int random=0,bit;
	unsigned int *randptr = &random;
	FILE *fp;
	if ((fp = fopen("data.bin", "w+b")) == NULL){
		fprintf(stderr,"Impossible d'ouvrir le fichier\n");
		exit(1);
	}
	for(i=0; i<= 10*periode; i++){
		//printf("%u %u\n",i,p);
		if (i == p){
			printf("i=%lu ", i);
			p <<= 1;}
		bit = (int)(2*(randFoncPtr()/(RAND_MAX + 1.0)));/*bit vaut 0 ou 1*/
		random <<= 1;
		random = (random | bit);/*on stocke la valeur de bit dans random*/
		if ((i+1) %32 == 0)
			fwrite(randptr,sizeof(int),1,fp);/*on ecrit l'entier ainsi cree dans le fichier*/
	}
	fclose(fp);
	printf("i = %lu",i);

}

Hors ligne

#2 Le 28/01/2008, à 04:35

slapierre

Re : Probleme de limitation ??

Le problème vient de la ligne suivante, o๠tu écris seulement une ligne pour i étant un multiple de 2^5 :

if ((i+1) %32 == 0)

J'ai modifié ton code pour afficher le tout à  l'écran, en modifiant la condition de fin de ta boucle for -- i<10*période -- j'appelle le programme de la façon suivante :

   $ ./rnd 1     # affiche 10 résultats
   $ ./rnd 2     # affiche 20 résultats

#include <stdio.h>
#include <stdlib.h>

void ecrire_bin(unsigned long periode,int (*randFoncPtr)()){
    unsigned long i,p=1;
    unsigned int random=0,bit;
    unsigned int *randptr = &random;

    for(i=0; i<= 10*periode; i++) {
        if (i == p) p <<= 1;
        bit = (int)(2*(randFoncPtr()/(RAND_MAX + 1.0)));/*bit vaut 0 ou 1*/
        random <<= 1;
        random = (random | bit); /*on stocke la valeur de bit dans random*/
//      if ((i+1) %32 == 0)	printf("i=%u, p=%u, random=%u\n",i, p, random);
		if ((i+1) %1 == 0)	printf("i=%u, p=%u, random=%u\n",i, p, random);
    }
}

int main (int argc, char *argv[]) 
{
	int periode=atoi(argv[1]);
	ecrire_bin(periode, rand);
	return 0;
}

Pour ce qui est de ton problème d'écriture dans un fichier de plus de 2Gb, je prilégirais la redirection des flux :

   $ ./rnd 1 > out.txt


Simon


"Le spectre de la folie nous empêchera-t-il de hisser l'étendard de l'imagination?" - André Breton

Hors ligne