Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : allouer de la mémoire pile. [ Archives / Au secours ] (deck_bsd)

mercredi 18 janvier 2006 à 16:43:58 | allouer de la mémoire pile.

deck_bsd

Membre Club
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;
}





mercredi 18 janvier 2006 à 17:05:56 | Re : allouer de la mémoire pile.

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..  )
et pourquoi ne pas allouer les retour à la ligne...
 

mercredi 18 janvier 2006 à 17:12:09 | Re : allouer de la mémoire pile.

deck_bsd

Membre Club
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???

mercredi 18 janvier 2006 à 17:26:11 | Re : allouer de la mémoire pile.

Arnotic

Administrateur CodeS-SourceS
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,
[ Lien ]
MVP Visual C++

mercredi 18 janvier 2006 à 17:30:21 | Re : allouer de la mémoire pile.

rrk275

on peu l'ouvrir avec fopen(nomfichier,"rb");
et wb pour ecrire et ab ...


mercredi 18 janvier 2006 à 17:40:50 | Re : allouer de la mémoire pile.

deck_bsd

Membre Club
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.


mercredi 18 janvier 2006 à 17:44:11 | Re : allouer de la mémoire pile.

deck_bsd

Membre Club
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.

mercredi 18 janvier 2006 à 18:16:59 | Re : allouer de la mémoire pile.

ymca2003

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...

mercredi 18 janvier 2006 à 18:40:39 | Re : allouer de la mémoire pile.

deck_bsd

Membre Club
comment récupéré tous en binaire? j'ai esseye fread(D_ptText,sizeof(D_ptText),1,fichier);

mais cela n'a pas marche.


mercredi 18 janvier 2006 à 18:49:45 | Re : allouer de la mémoire pile.

rrk275

je l'ai deja dit change ton fopen en "rb"pour l'ouvrir en binaire (surement me suis je mal exprimé .. ) ...



1 2

Cette discussion est classé dans : fichier, char, mémoire, retour, pttext


Répondre à ce message

Sujets en rapport avec ce message

multi lancement [ par deck_bsd ] Bonjour a tous, Voila j'ai un petit problème. J'ai dans un fichier txt des chemins vers différents programmes chacun sur une ligne. J'ai crée un peti Pb d'allocation mémoire malloc [ par oz80 ] Bonjour à tous, j'ai un problème d'allocation de mémoire je pense. Je déclare une variable comme ceci : <TBOD Gestion de la mémoire [ par DMK04 ] Salut,Je me demandais un truc sur la gestion de la mémoire. Je ne vois pas trop comment l'expliquer simplement et rapidement, voici donc un peu de cod convertir String to char [ par drcmomo ] Bonjour tout le monde!!!ce bout de programme me permet de rajouter un 0 devant jour et mois si ces derniers compris entre 0 et 9j'aimerais pourvoir re Ordre dans les déclarations de variables ??! [ par vincemail ] Bonjour à tous, je suis en train de faire un programme en C++ avec devC++, et je viens de trouver un bug que je n'arrive pas à comprendre, je veux sto Problème avec "fclose" [ par Polack77 ] Bonjours, cas fais 2 heures que je cherche mon bug et je ne trouve pas! C'est frustrant!J'ai fais pas mal de test et je ne trouve rien.Je met donc mon écriture fichier [ par thorodin ] Salut,Quand j'enregiste une jpeg sur la caméra et que je la transfère par filezilla  le fichier  édité  avec  hexedit  donne (pour la première ligne) [Langage C] Obtenir une ligne d'un fichier (scanf%[^X]) [ par Thranduil ] Bonjour, j'essaie de créer une fonction qui doit lire une ligne entière d'un fichier texte (donc jusqu'au '\n' mais ça ne marche pas. (C'est la même q fonction qui retourne une chaine==>libération de la mémoire [ par tibob51 ] Bonsoir,J'ai eu besoin d'utiliser une fonction me retournant une chaine,après mes recherches sur cpp france j'ai trouvé la syntaxe suivante:char* Fonc Problème avec les ajouts de chaînes de caractères [ par nisaloncaje ] Bonjour je voudrais ouvrir un fichier en utilisant :ifstream entree (nom_fichier, ios::in|ios::binary);où nom_fichier est le nom du fichier ;)Puis j'e


Nos sponsors

Sondage...

CalendriCode

Octobre 2008
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,34 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.