Problème avec les fichiers binaires

Fermé
Mourad2009B Messages postés 100 Date d'inscription lundi 23 août 2010 Statut Membre Dernière intervention 7 juillet 2023 - 14 juil. 2019 à 17:54
Mourad2009B Messages postés 100 Date d'inscription lundi 23 août 2010 Statut Membre Dernière intervention 7 juillet 2023 - 17 juil. 2019 à 14:51
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
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.
A voir également:

1 réponse

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
14 juil. 2019 à 19:48
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 de
TAILLE
dans le code écrit.
0
Mourad2009B Messages postés 100 Date d'inscription lundi 23 août 2010 Statut Membre Dernière intervention 7 juillet 2023
16 juil. 2019 à 00:20
Bonjour à tous les amis

merci pour vos réponses rapides

en fait, j'utilise cette fonction
void 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
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
16 juil. 2019 à 11:44
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 simple
void 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();
		}
	}
}
0
Mourad2009B Messages postés 100 Date d'inscription lundi 23 août 2010 Statut Membre Dernière intervention 7 juillet 2023
17 juil. 2019 à 14:51
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.
0