6
votes

Comment lire une chaîne à partir d'un fichier délimité à \ N

J'essaie de lire un fichier délimité de retour. plein de phrases.

J'essaie de mettre chaque phrase dans une chaîne. p>

Le problème est que lorsque j'essaie de lire le fichier avec P>

fscanf(file,"%50s\n",string);


0 commentaires

5 Réponses :


3
votes

FSCANF avec % s arrête de lire lorsqu'il trouve WhitSpace.

Puisque vous lisez un texte non formaté, vous pouvez simplement utiliser fgets , qui lit jusqu'à ce qu'il remplisse le tampon que vous le donnez, il trouve une nouvelle ligne ( \ n ), ou atteint la fin du fichier, selon la première éventualité.


2 commentaires

Cela fonctionne bizarre. Il ne lit pas toutes les lignes. et chaque chaîne au lieu de se terminer dans \ 0 se termine dans \ n


Chaque chaîne se termine toujours dans '\ 0' , mais le dernier caractère avant que ce soit habituellement '\ n' , car il se lit dans la ligne exactement tel qu'il apparaît dans le fichier . Si le '\ n' est absent, cela signifie que votre tampon n'était pas suffisamment grand pour la ligne entière ou que vous lisez simplement les derniers caractères du fichier et il n'a pas fini avec une nouvelle ligne.



5
votes
fscanf(file,"%50[^\n]\n",string);

Every character except \n will be consumed by [^\n]  
Maximum 0f 50 chars will be consumed (make sure string has space for 51 atleast)  
..\n",string this makes sure that \n is also consumed so that the next call does not just return a null string.

0 commentaires

2
votes

FSCANF peut être modifié pour lire des espaces passés. Les détails sont un peu compliqués. Voici ce que la page Man dit environ% [...]

correspond à une séquence non vide de caractères de l'ensemble spécifié de caractères acceptés; le prochain pointeur doit être un pointeur à char, et là doit être assez de place pour tous les caractères de la chaîne, plus un terminer le caractère nul. L'habituel Passer de l'espace blanc principal est supprimé. La chaîne doit être faite up de char-acters dans (ou pas dans) A ensemble particulier; L'ensemble est défini par les personnages entre l'ouverture support [caractère et proche support] caractère. L'ensemble exclut ces personnages si le premier caractère après le support ouvert est un circonflexe ^. Inclure une fermeture support dans l'ensemble, faites-le le premier caractère après le support ouvert ou le circonflexe; toute autre position va mettre fin à l'ensemble. Le trimphène caractère - est également spécial; lorsque placé entre deux autres caractères, Il ajoute tous les caractères intermédiaires à l'ensemble. Inclure un trait d'union, faites-le le dernier caractère avant la finale étroit support. Par exemple, `[^] 0-9-] 'signifie l'ensemble` `tout sauf support proche, zéro à travers neuf et trait d'union ''. La chaîne se termine avec l'apparition d'un personnage non dans le (ou, avec un circonflexe dans) set ou lorsque la largeur du champ s'épuise.

Donc,% [^ \ n] devrait tout lire jusqu'au retour du chariot.


2 commentaires

Il lit tout jusqu'à la nouvelle ligne mais pas la nouvelle ligne elle-même. Si vous bouclez sur FSCANF (fichier, "% [^ \ n]") , vous allez simplement continuer à obtenir la chaîne vide encore et encore. Vous devez consommer la nouvelle ligne avec une espace blanche dans la chaîne de format ou quelque chose comme % * c .


@Adam bons points. La réponse acceptée ci-dessus est également plus sûre pour les erreurs de dépassement de tampon.



3
votes

Évitez d'utiliser scanf . Comme déjà mentionné, Vous devez utiliser fgets à la place.

Si vous ne voulez pas utiliser un tampon de taille fixe et permettre des lignes de longueur arbitraire, vous pouvez essayer d'utiliser Domaine public de Chuck Falconer Ggets Fonction . (Ce lien semble être en panne en ce moment, mais archive.org a une copie .)


0 commentaires

-1
votes

Envoyer inalitialement des données à l'aide de PayLoad_ID 00 01 02 03 .... 10

utiliser

char * pchar = ""; // pour la capture de chaîne.

FPRINTF (FP1, "% s", strok (pCHar, "PayLoLoD_ID"));


1 commentaires

Ici paylard_id est le délimiteur que vous pouvez spécifier