7
votes

Comment govery tokeniser la chaîne au tableau de INT en C?

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> xxx pré>

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};


1 commentaires

Merci pour tout, mais maintenant je réalise que le problème est de vous goverser.


6 Réponses :


14
votes

Le code suivant lira un fichier une ligne à la fois xxx pré>

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";


4 commentaires

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!



2
votes

Ce que je ferais, c'est faire une fonction comme ceci: xxx

dans la fonction, allouez une certaine mémoire au pointeur * A , puis commencez les numéros de lecture à partir du f et stockez-les dans * A . Lorsque vous rencontrez un caractère de nouvelle ligne, renvoyez simplement le nombre d'éléments que vous avez stockés dans * A . Ensuite, appelez-le comme ceci: xxx

fonctions utiles:

  • Malloc () à allouer un tableau.
  • realloc () à Étendre un MALLOC () ED TRAY
  • fgets () à Lisez une ligne de texte (ou autant que possible de stocker).
  • sscanf () à Lire les données d'une chaîne (telle qu'une chaîne renvoyée par fgets () ) dans d'autres variables (telles qu'un tableau int créé par malloc () - Astuce d'indice)

0 commentaires

0
votes

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;
}


3 commentaires

Pourquoi stockez-vous un line_number comme type type ? 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.



2
votes

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.


1 commentaires

Mieux encore: Utilisez strtol () afin que vous n'ayez pas besoin strtok ()



1
votes

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 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>

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 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>

la fonction 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>

Utilisation de votre fichier d'entrée de: 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;
}


0 commentaires

0
votes

Utiliser strtol () pour analyser chaque ligne: xxx


0 commentaires