Voila un programme qui doit effectue un tri externe.
jai les fonctions suivante(creation pour cree le fichier principal et les fichiers auxiliaire).
Le principe est le suivant je lit les chaines du fichier de depart par paquet de 1000.
Je les trie avec un heapsort et je les met tour a tour sur les 8premiers fichiers auxiliare(ca cest le role de la fonction enregistrement).
Cest de cette fonction que vient le probleme,jai un fseek et un fwrite a la fin.
Lorsque je met fwrite ... sizeof(memoire[1000][20]) ce qui represente un paquet de 1000chaine de 20 char, le resultat est quil me met n'importe quoi au debut de chaque fichier au lieu de repartir sur tout le fichier.
Lorsque je met le nombre doctet a ecrire (20000octets) a la place dutiliser sizeof, la il me rempli le premier fichier auxiliare avec 4giga de vide. Voici le code ou est le probleme please!!!!
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BIDON 1000000
#define M 1000
#define N 8
void creation(void);
void tri_heap(char[M][20]);
void enregistrement(char[M][20], int *);
int main(void)
{
int i, j, aux;
FILE *pf;
char memoire[M][20];
clrscr();
aux=0;
creation();
pf=fopen("\\depart.dat","rb");
printf("Pourcentage de la phase d'initialisation :");
for(j=0;j<M;j++)
{
fread(&memoire[0][0],sizeof(memoire[M][20]),1,pf);
tri_heap(memoire);
/* enregistrement(memoire, &aux); */
gotoxy(44,1);printf("%d",j/10);
}
fclose(pf);
getch();
}
/*************************Creation des fichiers**************************/
void creation()
{
FILE *pf, *pa;
char a, remplissage[20], tmp[15], nom[15];
long i;
int hasard, j;
randomize();
pf=fopen("\\depart.dat","w+b");
if(pf!=NULL)
{
for(i=0;i<BIDON;i++)
{
for(j=0;j<19;j++)
{
hasard=rand();
a=97+hasard%26;
remplissage[j]=a;
}
fwrite(&remplissage,sizeof(remplissage),1,pf);
}
fclose(pf);
printf("Cr,ation du fichier principal reussie");
}
else {
printf("Impossible de cr,, le fichier principal le programme se termine");
}
strncpy(remplissage," ",20);
for(j=0;j<16;j++)
{
strcpy(nom,"auxi");
itoa(j,tmp,15);
strcat(nom,tmp);
strcat(nom,".dat");
pa=fopen(nom,"w+b");
fclose(pa);
if(pa!=NULL)
{
pa=fopen(nom,"r+b");
for(i=0;i<125000;i++)
fwrite(&remplissage,20,1,pa);
printf("\nCr,ation de %s reussie",nom);
}
else {
printf("Impossible de cr,, %s",nom);
}
fclose(pa);
}
puts("\nFin de la cr,ation des fichiers appuyez sur une touche");
getch();
clrscr();
}
/**************************FONCTION TRI_HEAP*****************************/
void tri_heap(char memoire[M][20])
{
int i,n,q,p,keep_on, g, d;
char tmp[20];
n=1;
while(n!=M)
{
q=n;
p=(q-1)/2;
while(q!=0&&strncmp(memoire[p],memoire[q],20)<1)
{
strncpy(tmp,memoire[p],20);
strncpy(memoire[p],memoire[q],20);
strncpy(memoire[q],tmp,20);
q=p;
p=(q-1)/2;
}
n=n+1;
}
/* Tri */
n=N-1;
while(n!=0)
{
strncpy(tmp,memoire[0],20);
strncpy(memoire[0],memoire[n],20);
strncpy(memoire[n],tmp,20);
n--;
/* Reconstruction du tas */
p=0;
g=1;
d=2;
keep_on=1;
while(keep_on==1)
{
if(d<=n&&(strncmp(memoire[d],memoire[g],20)>=1&&strncmp(memoire[d],memoire[p],20)>1))
{
strncpy(tmp,memoire[p],20);
strncpy(memoire[p],memoire[d],20);
strncpy(memoire[d],tmp,20);
p=d;
g=2*p+1;
d=g+1;
}
else if(d==n+1&&(strncmp(memoire[g],memoire[p],20)>1)||(d<=n&&strncmp(memoire[g],memoire[p],20)>1&&strncmp(memoire[g],memoire[d],20)>=1))
{
strncpy(tmp,memoire[p],20);
strncpy(memoire[p],memoire[g],20);
strncpy(memoire[g],tmp,20);
p=g;
g=2*p+1;
d=g+1;
}
else {
keep_on=0;
}
}
}
printf("%20s ",memoire[i][0]);
}
/************************ENREGISTREMENT************************************/
void enregistrement(char memoire[M][20],int *aux)
{
FILE *pa;
int auxi;
auxi=*aux;
auxi=auxi%8;
switch (auxi)
{
case 0:pa=fopen("auxi0.dat","r+b");break;
case 1:pa=fopen("auxi1.dat","r+b");break;
case 2:pa=fopen("auxi2.dat","r+b");break;
case 3:pa=fopen("auxi3.dat","r+b");break;
case 4:pa=fopen("auxi4.dat","r+b");break;
case 5:pa=fopen("auxi5.dat","r+b");break;
case 6:pa=fopen("auxi6.dat","r+b");break;
case 7:pa=fopen("auxi7.dat","r+b");break;
}
auxi=*aux-auxi; /* Soustrait le reste du nombre total de bloc tri, */
auxi=auxi/8; /* D,termine l'emplacement dans le fichier auxiliaire */
fseek(pa,auxi*sizeof(memoire),0); /* Place le pointeur . l'endroit voulu */
fwrite(&memoire,sizeof(memoire),1,pa);
(*aux)++;
fclose(pa);
}