Splitter de fichier

Signaler
Messages postés
233
Date d'inscription
jeudi 4 juillet 2002
Statut
Membre
Dernière intervention
5 juillet 2008
-
Messages postés
202
Date d'inscription
vendredi 6 juillet 2001
Statut
Membre
Dernière intervention
31 octobre 2007
-
salut à tous

En fait je fais un splitter de fichier mais j'ai un probleme. il me rajoute 1 octet sur la découpe et 1 octet par fichier pour la reconstitution.
Je pense que la c dans dans les boucles que je dois merder. pourtant seulement un caractere est rajouté dans la découpe même si il se découpe en 4 fichiers.
Si vous pouvez m'aider ça serait cool
Merci
24.KaraS
--->
G une fenêtre qui possede une textbox pour saisir le nom du fichier à couper ou à coller.
une autre textbox pour saisir la taille de découpe
et 2 checkbox pour savoir si on veux couper ou coller.
Et il y a le bouton (ID_lancer) pour éxécuter.

---->le source

#include <windows.h>
#include <stdlib.h>
#include "resource.h"
#include<stdio.h>

LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam);
HINSTANCE hInstance_recup; //variable globale pour utiliser hinstance dans
//le traitement des messages

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hDlg;
hDlg=CreateDialog(hInstance,(LPCTSTR)IDD_DIALOG1,NULL,(DLGPROC)MainProc);
ShowWindow(hDlg,SW_SHOW);
MSG msg;

//récupération de hinstance pour le traitement des messages
hInstance_recup = hInstance;

//gestion des messages
while(GetMessage(&msg,hDlg,0,0)==TRUE)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam)
{

char chemin[250]= {".\"}; //chemin du fichier source
char chemin_final[250]= {" "}; //chemin des fichiers à créer
char tailles[10]= {" "}; //nom du film
int taille=0; //conversion de la taille saisie en entier

FILE *source,*destination; //fichier à lire

int num =0; //indice du numero de fichier créé
char tampon[2] = {" "};
int nb=0; //nombre de caracter lu pour chaque fichier
int lu=0; //retour de la fonction fread
char numstr[20] = {" "};
bool fin=false; //variable pour la fin de la reconstitution
int ecrit = 0;

//gestion des messages
int Select;
switch(message)
{
// Saisie du deplacement de la fenetre par un clic continu sur celle ci
case WM_LBUTTONDOWN:
SendMessage(Dlg,WM_NCLBUTTONDOWN, HTCAPTION,0);
break;

//boutons
case WM_COMMAND:
Select=LOWORD(wParam);
switch(Select)
{
//bouton lancer
case IDLANCER:

//rien n'est coché
if ( SendMessage (GetDlgItem (Dlg,ID_COLLER),BM_GETSTATE,0,0) == BST_UNCHECKED
&& SendMessage (GetDlgItem (Dlg,ID_COUPER),BM_GETSTATE,0,0) == BST_UNCHECKED)
{
MessageBox (0,"Veuillez cocher une case","Erreur",0);
break;
}

//tout est coché
if ( SendMessage (GetDlgItem (Dlg,ID_COLLER),BM_GETSTATE,0,0) == BST_CHECKED
&& SendMessage (GetDlgItem (Dlg,ID_COUPER),BM_GETSTATE,0,0) == BST_CHECKED)
{
MessageBox (0,"Veuillez cocher une seule case","Erreur",0);
break;
}

//On coupe ?
if (SendMessage (GetDlgItem (Dlg,ID_COUPER),BM_GETSTATE,0,0) == BST_CHECKED)
{
GetDlgItemText (Dlg,IDC_CHEMIN,chemin,250); //recup chemin
GetDlgItemText (Dlg,IDC_TAILLE,tailles,10); //recup taille
taille = atoi (tailles); //conversion en entier
taille *= 1000; //on met la taille en Ko

//on ouvre le fichier à couper
source = fopen(chemin,"rb");

//on concatène le nom du fichier avec .part
strcat (chemin,".part");

//tant que ce qu'on lit = ce qu'on doit lire (do while)
do
{
//on doit changer le nom de fichier pour la découpeif ( (nb 0) | (nb taille) )
{
//on initialise la variable de caractere lu
nb = 0;

//on incrémente la variable du fichier
num++;
strcpy (chemin_final,chemin);

//on la concatène avec le nom global : nom.part
itoa (num,numstr,10);
strcat (chemin_final,numstr);

//on crée le fichier destination
destination = fopen (chemin_final,"wb");
fclose (destination);
}

//on lit le fichier source
fread (tampon,sizeof(char),1,source);
nb ++;

//on ouvre le fichier destination à la finif ((destination fopen (chemin_final,"ab")) NULL)
{
destination = fopen (chemin_final,"wb");
}

//on écrit le fichier destination
fwrite(tampon,sizeof(char),1,destination);

//on ferme le fichier destination
fclose (destination);

//on test la fin du fichier source
}
while (!feof (source));

//on ferme le fichier source
fclose (source);

//on affiche un message
MessageBox (0,"Le fichier a été découpé","Succés",0);
}

//On colle ?
if (SendMessage (GetDlgItem (Dlg,ID_COLLER),BM_GETSTATE,0,0) == BST_CHECKED)
{
GetDlgItemText (Dlg,IDC_CHEMIN,chemin,250); //recup chemin

//ouvre le fichier destination à créer
destination = fopen(chemin,"wb");

//on concatène le nom du fichier avec .part
strcat (chemin,".part");

//tant qu'il y a des fichiers à coller
while (fin != true )
{
//on augmente l'indice du fichier à lire
num++;

//on recopie le chemin pour ne pas le modifier
strcpy (chemin_final,chemin);

//on concatène le nom avec l'indice
itoa (num,numstr,10);
strcat (chemin_final,numstr);

//On ouvre chaque fichier source 1 par 1
if ((source = fopen (chemin_final,"rb")) != NULL )
{

//tant qu'il y a des données
while (!feof(source))
{
//lecture du fichier
fread (tampon,sizeof(char),1,source);

//ecriture du fichier
fwrite (tampon,sizeof(char),1,destination);

}

//on ferme le fichier source
fclose (source);
}
else
{
//on quitte la boucle
fin = true;
}

} //fin du while

//on ferme le fichier destination
fclose (destination);

//on affiche un message
MessageBox (0,"Le fichier a été recollé","Succés",0);
}
return TRUE;

//bouton quitter
case IDCANCEL:
EndDialog(Dlg,Select);
PostQuitMessage(0);
return TRUE;

//bouton a propos
case IDABOUT:
MessageBox (0," Codé par 24.KaraS\n\n Greetz\n Kheo pour la ressource ;-)\n MinoS pour les cours de crack","A propos",0);
return TRUE;
}
default:
return FALSE;
}
return 0;
}

3 réponses

Messages postés
202
Date d'inscription
vendredi 6 juillet 2001
Statut
Membre
Dernière intervention
31 octobre 2007

while (!feof(source))
{
//lecture du fichier
fread (tampon,sizeof(char),1,source);

//ecriture du fichier
fwrite (tampon,sizeof(char),1,destination);

}

le prob vient de la, c'est tout con, feof sera true apres le fread or tu fais un fwrite apres et la condition sera testé apres le fwrite, donc trop tard. pour remedier remplace plutot par:

while (1)
{
//lecture du fichier
fread (tampon,sizeof(char),1,source);
if(feof(source))break;
//ecriture du fichier
fwrite (tampon,sizeof(char),1,destination);
}

ça devrait marcher parfaitement =)
Bonne continuation
Messages postés
233
Date d'inscription
jeudi 4 juillet 2002
Statut
Membre
Dernière intervention
5 juillet 2008

Merci pour ton aide Thaeron
c sûr que ça vient de la !!
comment ais-je pu être aussi bête
encore merci
24.KaraS
Messages postés
202
Date d'inscription
vendredi 6 juillet 2001
Statut
Membre
Dernière intervention
31 octobre 2007

bhen de rien, j'avais fais la meme erreur, suffit d'y penser =)