Bonjour, j'ai un pb, je dois réaliser un programme qui copie des images d'un dossier vers un autre. Les images choisies sont issues d'une liste en txt. Ca a l'air très simple à première vue mais je galère:
J'ai donc un dossier source contenant pleins d'images (+de 10000) et un dossier destination vide. un fichier texte où sont inscrit les noms des images que je dois récupérer dans le dossier source, ces noms d'image sont séparés par des retours chariots et la fin de la liste est marqués par un espace. J'arrive à récupérer le chemin source, le chemin destination, à y rajouter le nom récupéré dans la liste et de copier l'image. Mais cela uniquement pour des noms d'images de 6 caractères, pas 7. je ne comprend pas pourquoi! Je cherche le début de mon nom d'image en parcourant ma liste à la recherche d'une lettre majuscule (toute ma base d'image commence par une lettre majuscule) et je signale la fin de mon nom lorsque je rencontre un retour chariot, pourtant pour des images sur 7 caractères visual me renvoie un "Accès Violation" et demande la SBHEAP.c
Please Help!
voici mon code:
CFile Fichier;
char NomImage[10];
char ListeImage[20000];
char NomCheminSource[500]; char NomCheminDestination[500];
long TailleCheminSource,TailleCheminDestination;
long TailleNomImage,FinFichier;
long DebutNom,FinNom;
char* NomImageReduit;
int Image[225000];
int m;
Fichier.Open(NomFichier,CFile::modeRead);
Fichier.Read(&ListeImage,10000*sizeof(char)); //ici on recupere la liste des images à copier
Fichier.Close();
DebutNom=0; FinNom=0; TailleNomImage=7; FinFichier=1; // valeur par défaut
Auparavant on a recupéré les chemins sources et destinations jusqu'au '\' il ne reste qu'à recuperer le nom de l'image lui rajouter .bmp et on peut aller la chercher...
for(int k=0;k<20000;k=k+TailleNomImage)
{
if (FinFichier==1){
while((ListeImage[k]<64)||(ListeImage[k]>90)) {k++;} //tant qu'on ne tombe pas sur le debut d'un nom on incrémente
if ((ListeImage[k]>64)&&(ListeImage[k]<90))
{
// si on es au debut du nom d'une image(LETTRE MAJ) alors on cherche la fin
m=k;
DebutNom=k;
while(ListeImage[m+1]!='\n') //tant que pas retour chariot
{
if(ListeImage[m+1]!=-52) //si pas fin fichier
{
NomImage[m-k]=ListeImage[m];
FinNom=m; //on es a la fin d'un nom pas du fichier
m++;
}
else
{
ListeImage[m+1]='\n'; //on es a la fin du fichier: presence d'un "espace"
NomImage[m-k]=ListeImage[m];
FinFichier=0;
FinNom=m;
}
TailleNomImage=FinNom-DebutNom+1;
} //fin while
} //fin if
// a ce stade on a recupéré le nom et la taille de notre image
for(i=TailleCheminSource+1;i<TailleCheminSource+1+TailleNomImage;i++)
{
NomCheminSource[i]=NomImage[i-(TailleCheminSource+1)];
}
NomCheminSource[TailleCheminSource+TailleNomImage+1]='.';
NomCheminSource[TailleCheminSource+TailleNomImage+2]='b';
NomCheminSource[TailleCheminSource+TailleNomImage+3]='m';
NomCheminSource[TailleCheminSource+TailleNomImage+4]='p';
char *CheminSourceReduit;
CheminSourceReduit=new char [TailleCheminSource+TailleNomImage-4];
for (i=0;i<TailleCheminSource+TailleNomImage+5;i++){CheminSourceReduit[i]=NomCheminSource[i];}
CString NomSource(CheminSourceReduit);
CheminSourceReduit=NULL;
delete [] CheminSourceReduit;
int Image[225000];
if( Fichier.Open(NomSource,CFile::modeRead))
{
Fichier.Read(&Image,sizeof (Image));
Fichier.Close();
} //on a le contenu de l'image voulu dans Image
for(i=TailleCheminDestination+1;i<TailleCheminDestination+1+TailleNomImage;i++)
{
NomCheminDestination[i]=NomImage[i-(TailleCheminDestination+1)];
}
NomCheminDestination[TailleCheminDestination+TailleNomImage+1]='.';
NomCheminDestination[TailleCheminDestination+TailleNomImage+2]='b';
NomCheminDestination[TailleCheminDestination+TailleNomImage+3]='m';
NomCheminDestination[TailleCheminDestination+TailleNomImage+4]='p';
char *CheminDestinationReduit;
CheminDestinationReduit=new char [TailleCheminDestination+TailleNomImage-4];
for (i=0;i<TailleCheminDestination+TailleNomImage+5;i++){CheminDestinationReduit[i]=NomCheminDestination[i];}
CString NomDestination(CheminDestinationReduit);
CheminDestinationReduit=NULL;
delete CheminDestinationReduit;
Fichier.Open(NomDestination,CFile::modeCreate);
Fichier.Close();
Fichier.Open(NomDestination,CFile::modeWrite);
Fichier.Write(&Image,sizeof(Image));
Fichier.Close();
}
}