bonjour,

je cherche a remplir un flux de sortie, tant qu'il y a encore des données (issues de la lecture d'un fichier via le protocole FTP) à y envoyer. Mais à la fin de toute l'opération, je constate que mon fichier de sortie contient des octets en moins (si j'utilise l'opérateur <<) ou en trop (si j'utilise la méthode ofstream::write). Voici un testcase réduit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ofstream ofs(dst, ios::trunc);
if (!ofs)
	return false;
char buf[256];
int n = sizeof(buf);
int s = 0;
while (42)
{
	if (!FtpRead(src, buf, n))
		return false;
	if (n <= 0)
		break;
	ofs.write(buf, n);
	s += n;
}
FtpEndRead();
L'entier s ne sert qu'a débuguer, il compte le nombre d'octets total lus par FtpRead(). A la sortie de la boucle, s contient bien la taille du fichier src, comme attendu. Par contre, le fichier dst est trop gros (sa taille est supérieure à la valeur de s)... le problème viendrait de ofs.write() ?

Voici la méthode FtpRead (qui utilise l'API wininet):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool	CNetwork::FtpRead(const char *file, const char *dst, int &size)
{
	if (_h_ftp == NULL)
	{
		_h_ftp = FtpOpenFile(_h_connect, file, GENERIC_READ, FTP_TRANSFER_TYPE_BINARY, 0);
		if (_h_ftp == NULL)
			return false;
	}
	DWORD n;
	if (InternetReadFile(_h_ftp, (LPVOID)dst, (DWORD)size, &n) == FALSE)
		return false;
	size = n;
	return true;
}
Merci d'avance :-)