Probleme avec eof :(

[Résolu]
Signaler
Messages postés
76
Date d'inscription
lundi 5 septembre 2005
Statut
Membre
Dernière intervention
3 juillet 2007
-
Messages postés
76
Date d'inscription
lundi 5 septembre 2005
Statut
Membre
Dernière intervention
3 juillet 2007
-
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

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
#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++
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
76
Date d'inscription
lundi 5 septembre 2005
Statut
Membre
Dernière intervention
3 juillet 2007

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 :)
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
76
Date d'inscription
lundi 5 septembre 2005
Statut
Membre
Dernière intervention
3 juillet 2007

Ok merci bcp pour les info je vais me cultiver un peu :)