la lecture inconnu nombre d'entiers à partir de stdin (C)
J'ai besoin de lire un fichier d'entrée comme :
1
19 20 41 23
2
41 52 43
3
90 91 941
4
512
5
6
51 61
Chaque impair ligne est un entier. Chaque même ligne est inconnu nombre d'entiers.
Il est très facile en C++
while( cin >> k ){
............
}
Je ne suis pas tellement habitué à C, donc je ne pourrais pas le faire en C. Tous les moyens de le faire?
- Avez-vous à payer l'attention sur les lignes, ou est-ce juste une série de nombres entiers à venir dans? Dans votre exemple, il semble que les lignes impaires sont des numéros de séquence et les même lignes représentent quelque chose d'autre.
- david j'ai besoin de prêter attention à la lignes. c'est pourquoi je ne pourrais pas le faire. J'ai besoin d'arrêter l'obtention de nouvelles valeurs à la fin de chaque même ligne. Parce que j'ai une structure avec des attributs id et de la liste. chaque impair ligne est un id et même chaque ligne d'une liste. Je veux remplir un struct avec 2 lignes de données et de les déplacer vers une autre structure et de le remplir avec un autre 2 lignes de données, etc...
- Lire dans l'ensemble d'une ligne à la fois et puis il suffit de l'analyser comme une chaîne de caractères
Vous devez vous connecter pour publier un commentaire.
La façon dont je voudrais faire c'est de le décomposer en deux opérations: lire une ligne, puis de lire les entiers dans cette ligne. Ici, c'est un paresseux mise en œuvre à l'aide de la bibliothèque standard C:
fgets()
divise le flux d'entrée à un littéral numérique? Vous allez vous retrouver avec deux valeurs numériques au lieu d'un. Par exemple, à partir de 12345 vous pourriez obtenir 123 dans la dernière itération de la boucle for et 45 dans la première itération de la boucle après le prochain appel defgets()
. Donc, je préfèrescanf()
etfscanf()
pour cette tâche, comme illustré par Sean.scanf()
solution posté par Sean ne résout pas le problème, car il ne distingue pas les sauts de ligne à partir d'autres espaces.getchar()
pour analyser les entiers sans un tampon intermédiaire est complexe. À l'aide degetline()
n'est pas portable. Et enfin, vous pouvez le faire en Python assez facilement, mais ce n'est pas C. peut-être la meilleure chose à faire, si vous ne pouvez pas garantir lignes plus courtes que certains grand nombre, et vous ne pouvez pas utiliser Python au lieu d'écrire votre propre version degetline()
.getline()
fait partie de la norme POSIX, il n'est tout simplement pas disponible sur Windows.L'exécution de votre fichier d'entrée par le biais de:
Résultats dans:
C'est le C analogique de la code vous faites référence dans votre question initiale.
Je voudrais briser le programme dans les différentes tâches.
La première étape est d'être capable de lire une paire de lignes, la première ligne qui vous indique le nombre de numéros à lire, et puis la deuxième ligne à lire les chiffres réels. Pour cela, une fonction appelée quelque chose comme
read_set
pourrait être utile. Il devrait être en mesure de retourner le nombre de lecture, et le signal de fin de fichier ainsi que les erreurs. Pour cela, nous pouvons définir une structure de données telles que:et puis nous pouvons déclarer notre fonction avec le prototype:
La fonction permet d'allouer de la mémoire pour
num->data
, et de définirnum->len
à la valeur correcte. Elle renvoie 0 en cas de succès, et d'un ensemble de conditions d'erreur sinon. Nous pourrions obtenir la fantaisie et à l'utilisation d'unenum
pour le retour à des statuts plus tard. Pour l'instant, disons que 0 = succès, 1 = fin de fichier, et tout le reste est une erreur.L'appelant appelle ensuite
read_set()
dans une boucle:Pour la mise en œuvre de
read_set()
: il doit lire les deux lignes. Il y a beaucoup de les implémentations de la lecture d'une ligne entière en C, de sorte que vous pouvez utiliser n'importe quel d'entre eux, et de lire une ligne d'abord, puissscanf()
/strtoul()
pour un nombre (vérifier sa valeur de retour!). Une fois que vous avez le nombre de nombres,n
, vous pouvez lire la ligne suivante dans la mémoire, et à faire:Vous pouvez ensuite appeler à plusieurs reprises
sscanf()
oustrtol()
de stocker des nombres dansnum->data
. Vous devriez mettre en vérifie exactementn
numéros sont sur cette ligne.Notez que vous pouvez écrire
read_set()
dans d'autres façons aussi: lire une ligne de caractère par caractère, et d'analyser les chiffres que vous les lisez. Cela a l'avantage d'aller sur les données qu'une seule fois, et n'ayant pas besoin d'une grande mémoire tampon pour stocker l'ensemble de la ligne de saisie dans la mémoire, mais l'inconvénient est de faire de bas niveau vous des trucs et lecture des données caractère par caractère peut être lente.Je le ferais un de:
fgetc() pour lire les caractères individuels et les analyser vous-même (s'accumuler chiffres jusqu'à ce que vous frappez les espaces et vous avez un entier à convertir avec atoi(); si l'espace est un retour à la ligne, puis il met fin à une liste d'entiers)
fgets() pour lire une ligne à la fois, et ensuite d'analyser la chaîne (encore une fois, regardez pour les espaces séparant les valeurs) qu'il renvoie.
ont un coup d'oeil à getc(3) ou scanf(3)
Je suis venu avec une solution comme ceci: