Probleme avec eof :(

Résolu
lamoueste Messages postés 76 Date d'inscription lundi 5 septembre 2005 Statut Membre Dernière intervention 3 juillet 2007 - 15 nov. 2005 à 16:26
lamoueste Messages postés 76 Date d'inscription lundi 5 septembre 2005 Statut Membre Dernière intervention 3 juillet 2007 - 16 nov. 2005 à 10:56
Bonjour a tous alors j'ai un probleme plutot basique je voudrais savoir pkoi le compilateur refuse "FileR.eof()" alors qu'il n'y a pas de raison d'apres moi enfin si quelqu'un voit la solution merci d'avance :)

BOOL TranslateBinFile(FILE *FileR)
{
BOOL bErr = false;
FILE *FileW;
CString ChaineASC = "";
unsigned long cpt,longueur = 16;
char Buffer[16];

FileW = fopen("c:\\t\\b.txt","w");

if ( FileR ) // check if FileR is open
{
while(! FileR.eof() )// bug :'(
{
fread( Buffer, sizeof( char ), 16, FileR );

for(cpt = 0;cpt<longueur;cpt++)
{
if (Buffer[cpt] < 0x20)
{
ChaineASC += " .";//on remplace tous les caractères qui ne sont pas des lettres par un point
}//end if
else
{
ChaineASC += ' ';
ChaineASC += Buffer[cpt];
}//end else
}//end for
longueur += 16;

fwrite( ChaineASC,sizeof(char),16,FileW);
}//end while
}//end if

printf("%s",Buffer);

return bErr;
}//end function translatebinfile

5 réponses

BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 nov. 2005 à 18:01
#include <windows.h>


#define BUFF_READ (1024 * 4)
#define BUFF_WRITE (1024 * 8)
#define BUFF_TOTAL (BUFF_READ + BUFF_WRITE)
#define MEMDISPO (MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN)


char szappname[] = "Transfl";


int __stdcall TranslateFile(char *pszfl, char *pszdst)
{
HANDLE hfl, hdst;
DWORD d, i, r;
BYTE *pmem, *pdst;
int berr = 1; // PRESUME ERRREUR
hfl = CreateFile(pszfl, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);
if(hfl == INVALID_HANDLE_VALUE) goto transEXIT;
pmem = (BYTE*) VirtualAlloc(0, BUFF_TOTAL, MEMDISPO, PAGE_READWRITE);
if(!pmem) goto closeSRC;
hdst = CreateFile(pszdst, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
if(hdst == INVALID_HANDLE_VALUE) goto relMEM;
fromSRC:
// ON LIT PAR PASSES DE 4 Ko, POURRAIT ETRE PLUS
d = 0; ReadFile(hfl, pmem, BUFF_READ, &d, 0);
if(!d) goto srcOUT;
pdst = pmem + BUFF_READ; // BUFFER ECRITURE
for(i = 0; i < d; i++) {
*pdst++ = ' ';
*pdst++ = (pmem[i] < 0x20) ? '.': pmem[i];
}
// ON ECRIT DOUBLE DE TAILLE LUE
WriteFile(hdst, pmem + BUFF_READ, d * 2, &r, 0);
if(d >= BUFF_READ) goto fromSRC; // PEUT RESTER DES OCTETS A LIRE
srcOUT:
berr = 0; // OK NO ERROR EST FINI
CloseHandle(hdst);
if(berr) DeleteFile(pszdst);
relMEM: VirtualFree(pmem, 0, MEM_RELEASE);
closeSRC: CloseHandle(hfl);
transEXIT: return berr;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE x, PSTR y, int z)
{
int err = TranslateFile("D:\\Bidon.bin", "D:\\Bidon.txt");
MessageBox(0, err ? "ERREUR": "OK", szappname, 0);
return 0;
}

Voila, pas testé mais devrait aller, tu me diras.
Vois qu'il n'y a qu'1 alloc de mémoire et vaut pour 2 buffers (lecture et écriture).

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
3
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 nov. 2005 à 17:27
Tu le veux en vrai win32 ? excuse parce que là c'est vraiment trop le souk, imagine ce que ton CString fait comme allocs et desallocs, un scandale pour ton espace mémoire.

Le but est bien de séparer tout par un espace en plus de remplacer par '.' si octet < 32 ???

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
lamoueste Messages postés 76 Date d'inscription lundi 5 septembre 2005 Statut Membre Dernière intervention 3 juillet 2007
16 nov. 2005 à 09:57
Yep merci beaucoup BruNews mais je dois t'embeter encore un peu, pourrais-tu m'expliquer la ligne :
pmem = (BYTE*) VirtualAlloc(0, BUFF_TOTAL, MEMDISPO, PAGE_READWRITE);

J'ai regarder sur msdn mais j'avoue que je comprend pas ce que fait cette fonction ( precisement )

Et 2e chose : j'avais un CString comme parametre qui m'etait retourner par une autre fonction et j'arrive pas a convertir une CString en char* :(

Enfin merci bcp quoi qu'il en soit :)
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
16 nov. 2005 à 10:54
CString a un opérateur (char*) ou plutôt (LPSTR) donc devrait caster de lui même.

MEMDISPO est un #define perso pour (grosso modo) grouper demandes:
- réservation zone mémoire.
- affectation réelle illico de cette zone.
- flags READ et WRITE sur cette zone.
La zone est de plus complétement initialisée de zéros.

BUFF_TOTAL vaut 12 Ko pour 1 buff de 4 Ko pour lecture + 1 buff de 8 Ko qui sera où on met la translation avant d'en demander le tamponnage dans fichier en 1 seule passe.

Faut avoir Richter sur ton PC et t'y reporter en cas de doute:
http://brunews.free.fr/brunews/download/JR4.zip
http://brunews.free.fr/brunews/download/JR4Sources.zip

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lamoueste Messages postés 76 Date d'inscription lundi 5 septembre 2005 Statut Membre Dernière intervention 3 juillet 2007
16 nov. 2005 à 10:56
Ok merci bcp pour les info je vais me cultiver un peu :)
0