est ici une façon personne ne suggère d'autre, qui ne pas utiliser fscanf
afin que vous puissiez avoir la gestion des erreurs sain d'esprit:
char buffer[BUFSIZE];
size_t size = 5;
int *data = malloc(size * sizeof *line);
if(line == NULL) error();
while(fgets(buffer, sizeof buffer, fp)
{
size_t i = 0;
char *next = buffer;
while(*next && *next != '\n')
{
data[i++] = strtol(next, &next, 0);
// check for errors
}
}
En fait, au lieu d'essayer d'utiliser *scanf
« s "%d"
lire les caractères , utilisez la fonction qu'elle appelle (probablement) pour effectuer la conversion: strtol
. Où *scanf
passe par la chaîne pour correspondre à la chaîne de format, mais ne vous laisse pas "enregistrer votre place" entre les appels de fonction, strtol
fait, qui est ce que vous avez besoin de lire un nombre arbitraire d'entiers.
Je n'ai pas écrit tout votre code pour vous - vous devez faire le traitement des erreurs matérielles. erreurs possibles:
- , dans ce cas, vous pouvez essayer de faire
data
plus grand avec realloc
. Alternativement, vous pouvez parcourir la mémoire tampon et compter le nombre de numéros à l'avance, puis en allouer autant que vous n'avez pas besoin de réallouer plus tard.
fgets
n'a pas lu la ligne entière (vérifiez que le dernier caractère avant '\0'
est '\n'
). Dans ce cas, vous voudrez probablement recharger le tampon et continuer à lire les chiffres. Soyez prudent dans ce cas - vous devrez probablement revenir en arrière et recalculer le dernier numéro - fgets
pourrait l'avoir coupé. (Ceci est un désavantage d'utiliser fgets
.)
- Entrée erronée - gérer comme vous le souhaitez.
Je vais mettre à jour avec ma tentative initiale .. – soxarered
'some_int' est un pointeur non initié. Pourquoi avez-vous pris some_int est de type 'int *'? N'importe quelle raison. – Mahesh
Chaque ligne a-t-elle le même nombre de chiffres? Si oui, ce nombre est-il une constante de compilation ou une valeur d'exécution? –