Quelqu'un a quelque chose à lire sur la lecture d'un numéro séquentiel du fichier texte par ligne et de l'analyser à un tableau en C?
Ce que j'ai dans un fichier: p> Ce que je veux dans mon programme: P> array1[] = {12, 3, 45, 6, 7, 8};
array2[] = {3, 5, 6, 7};
array3[] = {7, 0, -1, 4, 5};
6 Réponses :
Le code suivant lira un fichier une ligne à la fois Vous pouvez ensuite jetter la saisie à l'aide de strtok () et SSCANF () pour convertir le texte en chiffres. P> de la page MSDN pour SSCANF: P> Chacune de ces fonctions [SSCANF et SWSCANF] renvoie la
Nombre de champs avec succès
converti et attribué; le retour
la valeur n'inclut pas les champs qui
ont été lus mais non attribués. Un retour
la valeur de 0 indique qu'aucun champ
ont été assignés. La valeur de retour est EOF
pour une erreur ou si la fin de la
la chaîne est atteinte avant le premier
conversion. P>
BlockQuote> Le code suivant convertira la chaîne en un tableau d'entiers. Évidemment, pour une matrice de longueur variable, vous aurez besoin d'une liste ou d'une liste de numérisation deux fois pour déterminer la longueur de la matrice avant de l'analyser réellement. P>
char seps[] = " ,\t\n";
Pourriez-vous me montrer comment utiliser SSCANF () pour un total des numéros inconnu par ligne afin de l'analyser à un tableau?
@ChRISF L'idée que j'ai trouvée ici est d'utiliser Int var pour une utilisation temporaire, BTW, merci beaucoup.
@CHRISF est là un moyen de faire gérer cela pour gérer 1,2, 4?
@Cokede - Cela fait longtemps que j'ai fait C en colère, je ne pense pas pouvoir vous aider ici. Je suis sûr qu'il y a une solution simple!
Ce que je ferais, c'est faire une fonction comme ceci: dans la fonction, allouez une certaine mémoire au pointeur fonctions utiles: p> * A code>, puis commencez les numéros de lecture à partir du
f code> et stockez-les dans
* A code>. Lorsque vous rencontrez un caractère de nouvelle ligne, renvoyez simplement le nombre d'éléments que vous avez stockés dans
* A code>. Ensuite, appelez-le comme ceci: p>
Malloc () Code>
à allouer un tableau. li>
realloc () code>
à Étendre un MALLOC () CODE> ED TRAY LI>
fgets () code>
à Lisez une ligne de texte (ou autant que possible de stocker). LI>
sscanf () code>
à Lire les données d'une chaîne (telle qu'une chaîne renvoyée par fgets () code>) dans d'autres variables (telles qu'un tableau
int code> créé par
malloc () code > - Astuce d'indice) LI>
ul> p>
Votre fichier a-t-il un nombre spécifique de lignes ou avez-vous besoin de pouvoir lire un nombre arbitraire dans des tableaux aléatoires?
Voici le code à lire dans une ligne de fichier par ligne. P>
#include <stdio.h> int main() { char *inname = "test.txt"; FILE *infile; char line_buffer[BUFSIZ]; infile = fopen(inname, "r"); if (!infile) { printf("Couldn't open file %s for reading.\n", inname); return 0; } while (fgets(line_buffer, sizeof(line_buffer), infile)) { // process line } return 0; }
Pourquoi stockez-vous un line_number code> comme type code> type code>? Voulez-vous être intrinsèquement limité à 127 lignes?
Pourriez-vous me montrer comment extraire les chiffres en utilisant SSCANF?
Line_Number ne devrait même pas être là-bas, c'est un artefact d'un autre code ... enlevé maintenant.
Je suggère fortement de ne pas utiliser SSCANF et vos amis lorsque le nombre de champs est variable. Utilisez strtok et ATOI . Assurez-vous simplement de lire bien le Strtok Manpage, de nombreux programmeurs que je connais trouvent sa syntaxe un peu surprenant au début. Notez également que Strtok modifiera la chaîne d'entrée afin que vous puissiez vouloir travailler sur une copie. P>
Mieux encore: Utilisez strtol () code> afin que vous n'ayez pas besoin
strtok () code>
Le code suivant peut être ce que vous recherchez. Espérons que vous n'aurez pas besoin de trop de description compte tenu des commentaires, mais si vous avez des questions, n'hésitez pas à demander.
Il utilise essentiellement un Il a également un moyen par lequel il Peut gérer des lignes de taille arbitraire dans le fichier d'entrée sans débordement tampon (sous réserve des contraintes de mémoire bien sûr). Gardez à l'esprit que le la fonction Utilisation de votre fichier d'entrée de: p> fgets code> boucle pour lire chaque ligne dans et
strtok code> pour séparer cette ligne dans les champs. Il construit une liste liée de tableaux entier contenant les données réelles - vous pouvez voir l'utilisation de cette liste liée dans le code à la fin qui décharge la table. P>
strtok code> n'attend que un espace entre chaque champ de la ligne bien que em> pourrait être recodé pour gérer plusieurs espaces ou même toute quantité d'espace blanc. J'ai gardé ce bit simple car le code devait déjà un peu gros: -) p>
atoi code> est utilisé pour convertir le mot individuel sur chaque ligne en entiers. Si vous voulez une vérification des erreurs sur ceux-ci, j'appellerais votre propre variante qui vérifie également que tous les caractères du mot sont numériques. P>
// Dump table for debugging.
for (curr = first; curr != NULL; curr = curr->next) {
printf ("%p, size = %d:\n ", curr, curr->size);
for (i = 0; i < curr->size; i++)
printf (" %d", curr->array[i]);
printf ("\n");
}
// Free resources and exit.
free (buff);
fclose (fin);
return 0;
}
Utiliser strtol () code> pour analyser chaque ligne:
Merci pour tout, mais maintenant je réalise que le problème est de vous goverser.