Allouer de la mémoire pile.

Signaler
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
-
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
-
Bonjour,





Voila j'ai un problème , j'ai fait une partie de programme qui est
chargé d'allouer juste assez de mémoire a un pointeur de type
char pour acceuillir le contenut d'un fichier (sachant que 1 caractères
= 1 octet). Cet ensemble d'instrustion fonctionne très bien... enfin il
y a un petit hic!. Je père un octet à chaque retour a la ligne dans le
fichier.



Je m'explique



exemple un fichier contenant :



Bonjour

ceci est un test

tout simplement



Il y a 2 retour a la ligne et bien j'alloue 2 octet en trop. Cela n'est
pas trop grave pour les petit fichier, mais lorsque l'on arrive a des
gros fichier de 123Mo ca fait bcp en trop.

Donc je voulait savoir si il n'y a pas une formule magique :D, une API,
que sais-je qui permettrai de savoir combien de retour a la ligne il y
a. Ou alors un autre code permettant de faire ce que je souhaite :p.



Car bon je peut savoir combien de retour a la ligne il y a mais en
lisant le fichier caractère par caractère et bon c'est pas une bonne
optimisation :p.



Voici mon code au cas ou:



int main(int argc, char *argv[]){

WIN32_FILE_ATTRIBUTE_DATA w32fad;

FILE *fichier;

char D_szFilePath[MAX_PATH];

char D_szPhrase[400];

char *D_ptText;

int D_lFileSize;



printf("\n Introduisez le nom du fichier et le chemin de celui-ci :_");

gets(D_szFilePath);



GetFileAttributesEx(D_szFilePath,GetFileExInfoStandard,&w32fad);



/* On alloue de la mémoire au pointeur phrase , de la taille du fichier */

D_ptText=(char*)malloc(sizeof(char)*w32fad.nFileSizeLow);



strcpy(D_ptText,"");



fichier=fopen(D_szFilePath,"r");

while(fgets(D_szPhrase,400,fichier)!=0){

strcat(D_ptText,D_szPhrase);

}

fclose(fichier);



D_lFileSize=strlen(D_ptText);



/* Code temporaire , juste pour voir les différentes tailles */

printf("\n SIZE TEXT : %d",D_lFileSize);

printf("\n SIZE FICHIER : %d",w32fad.nFileSizeLow);



/* Code temporaire, juste pour voir le résultat */

printf("\n%s",D_ptText);

getch();



free(D_ptText);



return 0;

}

15 réponses

Messages postés
540
Date d'inscription
vendredi 25 juin 2004
Statut
Membre
Dernière intervention
1 octobre 2007
2
pourquoi ouvrir un fichier en type texte qu'en il fait 123 mo???

(j'ai deja vu 5 mo en txt , mais c'est moi (par un programme) qui
l'avait crée ..mais 123 .. ca fait beaucoup de texte.. )

et pourquoi ne pas allouer les retour à la ligne...
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
rrk275 : "pourquoi ouvrir un fichier en type texte qu'en il fait 123 mo???

(j'ai deja vu 5 mo en txt , mais c'est moi (par un programme) qui
l'avait crée ..mais 123 .. ca fait beaucoup de texte.. )"



Moi je veut bien, mais comment aller lire dedans si on ne l'ouvre pas???
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
2
Je rappel q'une retour à la ligne c'est 2 caractères : \r et \n
Donc je ne vois pas et et le soucis.

@+
Arnotic,
Admin CS,
http://dev.winsysdev.com
MVP Visual C++
Messages postés
540
Date d'inscription
vendredi 25 juin 2004
Statut
Membre
Dernière intervention
1 octobre 2007
2
on peu l'ouvrir avec fopen(nomfichier,"rb");
et wb pour ecrire et ab ...
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
rrk275 : entièrement daccord avec toi, mais c'est le mode binaire. Hors
ici c'est des fichier "texte"(écrit par un utilisateur) et non dans
structure ou autre.



Arnotic : oui je venai de comprendre le pourquoi je croyai avoir faut.
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
le 123 Mo etait un exemple pour montré la différence :D il est kler que
un fichier texte de 128 Mo est très rare. C'était juste un exemple.
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
si tu ouvre un fichier en mode texte, les retours chariot \r\n du fichier seront transformés en \n => un octet de moins par ligne.
si tu l'ouvre en binaire, cette conversion n'a pas lieu et tu récupère tout le fichier.
C'est la seule différence entre les 2 modes d'ouverture.

Pour moi il est préferrable de l'ouvrir en binaire, tu sera sur qu'une couche intermédiaire ne t'enlèbe pas des octets...
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
comment récupéré tous en binaire? j'ai esseye fread(D_ptText,sizeof(D_ptText),1,fichier);



mais cela n'a pas marche.
Messages postés
540
Date d'inscription
vendredi 25 juin 2004
Statut
Membre
Dernière intervention
1 octobre 2007
2
je l'ai deja dit change ton fopen en "rb"pour l'ouvrir en binaire (surement me suis je mal exprimé .. ) ...
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
je l'ai deja dit change ton fopen en "rb"pour l'ouvrir en binaire (surement me suis je mal exprimé .. ) ...



Lol ça je l'ai fait mdr quand même :D non c'est juste qu'il net met absolument pas le contenu du fichier "dans" mon pointeur.
Messages postés
540
Date d'inscription
vendredi 25 juin 2004
Statut
Membre
Dernière intervention
1 octobre 2007
2
utilise fread plutot que fgets ...
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
Bon ça marche now, mais hum il ne me met pas la fin du fichier (il me
manque quelques mot) et aussi il me met le nom du fichier tout a la fin
:s . Est ce du a l'entete?
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
rkk275 : LOL lit ce que j'ai mit plus haut , j'avai bien mit rb et j'utilisai fread ptdr ;) lol de lol
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
pour la vérification d'ip , j'avai fait le programme en VB6 (et oui j'était un vbtiste me frappé pas :p ).



Voici le code cela pourra p-e t'aider. Il est très simple a comprendre.
Ne te préocupe pas des label et autre, juste sur la vérification . Je
t'ai mit d'ailleur juste la procédure qui calcule les classes.



code :



Private Sub Command1_Click()

Dim no_ip As Integer



no_ip = Val(Textip1.Text)



If Textip1.Text "" Then Textip1.Text 0

If Textip2.Text "" Then Textip2.Text 0

If Textip3.Text "" Then Textip3.Text 0

If Textip4.Text "" Then Textip4.Text 0



If no_ip > 0 And Val(Textip2.Text) <= 255 And Val(Textip3.Text)
<= 255 And Val(Textip4.Text) <= 255 Then 'Condition d'acceptation



If no_ip >= 1 And no_ip <= 126 Then 'Ip de classe A





Labelipclass.Caption = "A"

Labelmasqsr.Caption = "255.0.0.0"

Labelpriv.Caption = "non"

Labelpriv.ForeColor = &H0&



End If



If no_ip >= 127 And no_ip <= 191 Then 'Ip de classe B



Labelipclass.Caption = "B"

Labelmasqsr.Caption = "255.255.0.0"

Labelpriv.Caption = "non"

Labelpriv.ForeColor = &H0&



End If



If no_ip >= 192 And no_ip <= 213 Then 'Ip de classe C



Labelipclass.Caption = "C"

Labelmasqsr.Caption = "255.255.255.0"

Labelpriv.Caption = "non"

Labelpriv.ForeColor = &H0&



End If



If no_ip >= 224 And no_ip <= 239 Then



Labelipclass.Caption = "D (MULTICAST)" 'Ip de classe D

Labelmasqsr.Caption = "255.255.255.255"

Labelpriv.Caption = "non"

Labelpriv.ForeColor = &H0&



End If



If no_ip >= 240
Then
'Ip de classe E



Labelipclass.Caption = "E"

Labelmasqsr.Caption = "255.255.255.255"

Labelpriv.Caption = "oui (RESERVE)"

Labelpriv.ForeColor = &HFF&

End If



If no_ip 255 Or Val(Textip2.Text) 255 Or
Val(Textip3.Text) 255 Or Val(Textip4.Text) 255 Then 'Broadcast



Labelpriv.Caption = "oui (RESERVE)"

Labelpriv.ForeColor = &HFF&

MsgBox "(BROADCAST)", vbOKOnly & vbInformation, "ATTENTION!"





End If



If no_ip 10 Or no_ip 172 Or no_ip = 192 Or no_ip >= 240 Then



Labelpriv.Caption = "oui (RESERVE)"

Labelpriv.ForeColor = &HFF&





End If



Else



MsgBox "Mauvaise adresse ip", vbOKOnly & vbExclamation, "erreur"

End If

End Sub



End Sub





Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

Unload Me

Unload Form2

End Sub
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
ho le c**, je me suis gouré de post