-1
votes

Comment lire la prochaine ligne de fichier d'entrée jusqu'à la fin du fichier sans utiliser eof

J'ai un fichier d'entrée (disons 10 lignes) de paires de coordonnées avec chaque ligne à la recherche de quelque chose comme ceci:

(1653408W, 503223n) (1651614W, 502806N)

J'essaie de mettre l'entrée donnée au format DMS. Chaque ligne du fichier d'entrée se termine par un caractère \ n et j'aimerais boucler dans le fichier et arrêter après la finale \ n . Je pensais utiliser quelque chose comme: xxx

désolé pour une longue boucle conditionnelle et possible une faible lisibilité. Toute suggestion sur la façon de procéder?


8 commentaires

Qu'est-ce qui vous empêche de faire comme prévu? Pensez à faire un exemple de reproductible minimal .


Quel problème avez-vous avec l'utilisation de l'EOF?


Avez-vous essayé des tests sur le code que vous suggérez de voir comment cela fonctionne avec divers cas de test de fichier d'entrée simple? BTW, je suppose par nom de fichier Vous voulez vraiment dire le pointeur de descripteur de fichier.


\ n dans un SCANF La chaîne est un bit d'un drapeau rouge. Cela me fait preuve de question si l'auteur comprend comment scanf fonctionne.


La mission indique que les tests pour EOF sont inférieurs dans ce cas.


Clairement, je suis un débutant en C, tout conseil serait apprécié.


@Melpomene Ce commentaire n'est pas utile du tout, peut-être au lieu de remettre en question ma compréhension d'une fonction, essayez de l'expliquer à la place.


@cap pourquoi? Cela pourrait bien avoir été intentionnel. Mais si vous ne savez pas vraiment, pourquoi ne pas simplement vérifier le manuel de scanf ?


3 Réponses :


-1
votes

Il est meilleur conception pour lire des lignes d'un fichier avec une fonction de lecture à chaîne droite (comme fgets ), puis utilisez la chaîne d'analyse de la chaîne sur la chaîne lue à partir du fichier avec sscanf ou similaire. scanf -Family ne doit généralement pas être utilisé pour lire directement des flux directement, uniquement à partir de chaînes.

Ensuite, vous devez également vérifier la valeur de retour de SSCANF pour vous assurer que que chaque valeur a été numérisée dans le type souhaité de manière appropriée. xxx


3 commentaires

Curieux de savoir le bowvote. Des raisons, donc je peux améliorer ma réponse?


Ce n'est pas une meilleure conception pour utiliser des fgets, puis SSCANF à moins que vous n'ayez vraiment besoin. C'est une meilleure conception pour simplement utiliser FSCANF dans la manière dont il a été conçu.


@Chrisdodd Si une ligne dans le fichier ne correspond pas à la chaîne de format, FSCANF restera à la même position dans le flux. Cela nécessite une manipulation supplémentaire qu'un fgets / sscanf boucle ne serait pas



0
votes
#include <stdlib.h>
File *file;
size_t len = 0;
ssize_t read;
char * line = NULL;     
while ((read = getline(&line, &len, file)) != -1)
{
    printf("%s",line);
    if(sscanf(line, "....format",...)==16)){
           ..............
     }
}

1 commentaires

getline est une fonction POSIX; ce n'est pas standard c



1
votes

espaces et nouvelles lignes dans la chaîne de format FSCANF ne correspondent pas aux espaces et aux nouvelles lignes de l'entrée. Au lieu de cela, tout personnage d'espaces dans le format signifie "sauter sur les espaces", lire et jeter des espaces blancs jusqu'à ce que tout caractère non-blancs soit trouvé - ce qui pourrait être le prochain caractère, de sorte que rien n'est ignoré. De plus, la plupart des spécificateurs de conversion ignorent également WhitSpace. Vous ne voulez donc que des espaces dans le format avant les Chaararcs littéraux ou % C code>, % [ code>% n code > directives, qui sont celles qui ne sautent pas blanchiment.

Donc, pour vos besoins, vous voulez une chaîne de format comme: p>

while(fscanf(file, " (%d%c ,%d%c )", &lonVal, &lonDir, &latVal, &latDir) == 4) {
    lonDeg = lonVal / 10000;
    lonMin = (lonVal % 10000) / 100;
    lonSec = lonVal % 100;


0 commentaires