9
votes

Comment utiliser Fgets si vous ne connaissez pas le nombre de caractères à lire?

J'ai besoin de lire un fichier et d'envoyer le texte à une chaîne afin que je puisse l'analyser. Cependant, le programme ne saura pas exactement combien de temps le fichier est, alors que ferais-je si je voulais utiliser fgets () ou y a-t-il une meilleure alternative?

Remarque: xxx


1 commentaires

Votre titre suggère que vous souhaitez utiliser Fgets mais que le texte implique que vous recherchez des alternatives. Qu'est-ce qui vous a fait aller pour les fgets en premier lieu ..?


4 Réponses :


0
votes

allouer un tampon (celui que STR pointe vers) et transmettez la taille du tampon pour num . L'espace réel adopté ne sera que la longueur du texte lu par fgets .

quelque chose comme: xxx

si la ligne suivante A 10 caractères avant la nouvelle ligne, alors STR détiennera ces 10 caractères, la nouvelle ligne et le terminateur null.

EDIT : Juste au cas où il y a une confusion, je n'ai pas fait t Invitez ce qui précède de sonner comme si l'espace supplémentaire dans le tampon n'est pas utilisé. Je voulais seulement illustrer que vous n'avez pas besoin de savoir à l'avance combien de temps votre chaîne va être, tant que vous pourrez mettre une longueur maximale dessus.


2 commentaires

Comment ça? À moins que vous réaffectiez le tampon, tout espace supplémentaire est toujours utilisé.


Je parle de l'espace dans le tampon, pas de l'espace en mémoire. En outre, la question de l'OP n'était pas sur la manière de sauvegarder la mémoire.



3
votes

Vous pouvez utiliser des fgets itérus, mais une alternative plus simple est (stdio.h's) GetLine . C'est dans Posix, mais ce n'est pas standard c.

Étant donné que vous utilisez C ++ cependant, pouvez-vous utiliser STD :: String Fonctions comme Iostream's GetLine ?


0 commentaires

10
votes

N'oubliez pas que fgets () lit une ligne à la fois, sous réserve d'avoir suffisamment d'espace.

Les humains écrivent rarement des lignes plus longtemps que ... 80, 256, choisissez un numéro ... Personnages. POSIX suggère une longueur de ligne de 4096. Donc, j'utilise habituellement: xxx

si quelqu'un craignait que quelqu'un puisse fournir plus de 4 000 données dans une seule ligne (et une machine Le fichier généré, tel que HTML ou JSON, pourrait contenir cela), vous devez alors décider quoi faire ensuite. Vous pouvez faire l'un des éléments suivants (et il y a probablement d'autres options que je n'ai pas mentionnées):

  1. Processez les lignes surchargées dans des bits sans supposer qu'il y avait une nouvelle ligne entre les deux.
  2. allouez la mémoire pour une ligne plus longue (disons 8k pour commencer), copiez le 4K initial dans le tampon alloué et en lisez plus de données dans la seconde moitié du tampon, itération jusqu'à la fin de la ligne.
  3. Utilisez la fonction POSIX 2008 getline () qui est disponible sur Linux. Il fait une allocation de mémoire pour vous.

0 commentaires

3
votes

Si vous n'êtes pas sur un système POSIX et que vous n'avez pas getline disponible, consultez Domaine public de Chuck Falconer Ggets / FGGETS Fonctions qui cultivent de manière dynamique un tampon pour consommer une ligne entière. (Ce lien semble être en panne en ce moment, mais archive.org a une copie .)


0 commentaires