2010-10-26 4 views
0

Hey, disons que je reçois un fichier en tant que premier argument de la ligne de commande.Lecture d'un fichier dans un tableau char, puis taille de malloc. (C)

int main(int argc, char** argv) { 
    unsigned char* fileArray; 

    FILE* file1 = fopen(argv[1], "r"); 
} 

Maintenant, comment puis-je aller sur la lecture de ce fichier, char par char, dans le char* fileArray?

Fondamentalement, comment puis-je convertir un FILE* à un char* avant que je sais à quel point grand que je dois malloc le char*

Je sais une solution possible est d'utiliser un tampon, mais mon problème est que je me occupe ici des fichiers qui pourraient avoir plus de 900 000 caractères, et ne le voient pas comme un tampon de taille suffisante.

+0

vous voulez dire que vous ne voulez pas de caractères dans l'emplacement de la mémoire continue? – Naveen

Répondre

2

Si seuls les fichiers « vrais » (flux non, dispositifs, ...) sont utilisés, vous pouvez utiliser stat/fstat ou quelque chose comme

int retval=fseek(file1,0,SEEK_END); // succeeded if ==0 (file seekable, etc.) 
long size=ftell(file1); // size==-1 would be error 
rewind(file1); 

pour obtenir au préalable la taille du fichier. Ensuite, vous pouvez malloc et lire. Mais puisque file1 peut changer entre-temps, vous devez toujours vous assurer de ne pas lire au-delà de votre taille de malloced.

1

Il y a quelques approches que vous pouvez prendre:

  • spécifier une taille maximale que vous pouvez gérer, alors que vous venez d'allouer une fois (que ce soit global ou sur le tas).
  • gérer le fichier en morceaux si vous avez peur de l'installer dans la mémoire à la fois.
  • gérer une taille arbitraire en utilisant malloc avec realloc (comme vous lisez les bits).

Numéro 1 est facile:

static char buff[900001];     // or malloc/free of 900000 
count = fread (buff, 1, 900001, fIn); 
if (count > 900000)      // problem! 

numéro 2 est probablement la meilleure façon de le faire à moins que vous absolument besoin le fichier entier en mémoire à la fois. Par exemple, si votre programme compte le nombre de mots, il peut traiter séquentiellement le fichier quelques K à la fois. Numéro 3, vous pouvez gérer une variable buffer, used et max. Initialement, définissez max à 50K et allouez buffer en tant que cette taille.

Ensuite, essayez de lire dans un bloc de 10 Ko dans un tampon fixe tbuff. Ajoutez le used actuel et le nombre d'octets lus dans tbuff et, si c'est plus grand que max, faites un realloc pour augmenter buffer par un autre 50K (en ajustant max en même temps). Puis ajouter tbuff à buffer, ajuster used, rincer et répéter. Notez que toutes ces valeurs (10K, 50K et ainsi de suite) sont uniquement des exemples. Vous pouvez utiliser différentes valeurs en fonction de vos besoins.