Problème avec les fichiers binaires
Mourad2009B
Messages postés
145
Statut
Membre
-
Mourad2009B Messages postés 145 Statut Membre -
Mourad2009B Messages postés 145 Statut Membre -
Bonjour à tous,
Comme on peut le deviner du titre, mon problème est que j’ai cette focnction pour copier un fichier binaire dans un autre
Le programme s’exécute normalement, le fichier source est lu parfaitement, et le fichier destination est enregistré (enfin presque)
les fichier images s’enregistrent très bien,
les vidéos s’enregistrent mais VLC me demande toujours de les réparées avant de les lires
et enfin les fichier texte s’enregistrent mais ils sont vides.
Alors SVP si vous avez une idée je vous serai vraiment très reconnaissant.
Comme on peut le deviner du titre, mon problème est que j’ai cette focnction pour copier un fichier binaire dans un autre
void CopyFiles::CopyFile(char fileSource[], char fileDest[])
{
ifstream FichierSource;
ofstream FichierDest;
const int TAILLE = 255;
FichierSource.open(fileSource, ios::in | ios::binary);
if(FichierSource.is_open())
{
char Buffer[TAILLE];
FichierDest.open(fileDest, ios::out |ios::binary);
if(FichierDest.is_open())
{
int32_t a = 0;
while(FichierSource.read((char*)Buffer, TAILLE))
{
FichierDest.write((char*)Buffer, TAILLE);
}
FichierDest.close();
}
FichierSource.close();
}
}
Le programme s’exécute normalement, le fichier source est lu parfaitement, et le fichier destination est enregistré (enfin presque)
les fichier images s’enregistrent très bien,
les vidéos s’enregistrent mais VLC me demande toujours de les réparées avant de les lires
et enfin les fichier texte s’enregistrent mais ils sont vides.
Alors SVP si vous avez une idée je vous serai vraiment très reconnaissant.
1 réponse
-
Bonjour,
VLC ne doit pas apprécier que la copie soit plus grande que l'original!
Vois-tu pourquoi la taille de la copie est forcément un multiple deTAILLE
dans le code écrit.-
Bonjour à tous les amis
merci pour vos réponses rapides
en fait, j'utilise cette fonctionvoid CopyFiles::CopyFile(const char FileSrcRec[], const char FileDestRec[])
{
FILE *FileSrc, *FileDest;
const int TAILLE = 2000;
long lsizeLu = 0;
char buffer[TAILLE_BUF];
if((FileSrc = fopen(FileSrcRec, "rb")) == NULL)
{
cout << "impossible d'ouvrir le fichier source";
exit(1);
}
if((FileDest = fopen(FileDestRec, "wb")) == NULL)
{
cout << "impossible d'ouvrir le fichier destination";
exit(1);
}
while((lsizeLu = fread(buffer, 1, TAILLE, FileSrc)) != 0)
{
fwrite(buffer, 1, lsizeLu, FileDest);
}
}
et ça marche très bien
si vous avez une autre solution, je suis preneur.
Merci beaucoup -
Ecrire un code qui mélange du code C et du code C++ est une solution tordue. Je trouve compliqué d'apprendre 2 langages pour un problème simple. D'autant qu'on peut corriger le C++ en utilisant la variable
lsizelu
.
On peut aussi écrire du vrai C++, et ça devient plus simplevoid CopyFile( const char fileSource[] , const char fileDest[] ) { std::ifstream FichierSource( fileSource , std::ios::in | std::ios::binary ); if ( FichierSource ) { std::ofstream FichierDest( fileDest , std::ios::out | std::ios::binary ); if ( FichierDest ) { FichierDest << FichierSource.rdbuf(); } } } -
Merci beaucoup à tous, et merci à toi Dalfab, très éfficace comme fonction, par contre je cherche à contrôler la taille du flux , pour l'associé à une progressBAr par exemple,
J'ai utilisé cette portion de code, mais je n'ai pas remarquer de différences, quand je changeaint la taille.int const TAILLE = 1024;
char mybuffer [TAILLE];
FichierDest.rdbuf()->pubsetbuf(mybuffer, TAILLE);
et voici la focntion complète.void CopyFiles::CopyFile(const char FileSrcRec[], const char FileDestRec[])
{
std::ifstream FichierSource( FileSrcRec , std::ios::in | std::ios::binary );
std::ofstream FichierDest( FileDestRec , std::ios::out | std::ios::binary );
int const TAILLE = 1024;
char mybuffer [TAILLE];
FichierDest.rdbuf()->pubsetbuf(mybuffer, TAILLE);
if ( FichierSource ) {
if ( FichierDest ) {
FichierDest << FichierSource.rdbuf();
}
}
}
merci d'avance pour votre aide.
-