2009-11-10 5 views
1

Nous avons reçu une affectation qui consistait à prendre des informations d'un fichier et à les stocker dans un tableau. Les données du fichier sont triées comme suitRécupération d'une chaîne avec des espaces d'un fichier dans C

 
New York   40 43 N 74 01 W 

les 20 premiers caractères sont le nom de la ville suivie par la latitude et la longitude. latitude et la longitude devrait être facile avec quelques

fscanf(infile, "%d( ou %c selon lequel je reçois )", pointer)

opérations de sorte qu'ils ne seront pas un problème.

Mon problème est que je ne sais pas comment collecter la chaîne pour le nom de la ville parce que certains des noms de villes ont des espaces. J'ai lu quelque chose à propos de l'utilisation des délimiteurs, mais d'après ce que j'ai lu, il semble que cela soit plus utilisé pour lire une ligne entière. Est-il possible de lire le nom de la ville à partir d'un fichier et de stocker le nom complet avec des espaces dans un tableau de caractères? Merci.

+0

À quoi devrait ressembler le tableau final? Ce n'est peut-être pas la meilleure façon d'accomplir ce que vous faites. –

+0

J'ai fait une classe pour la ville et une classe pour la coordonnée et ma classe de ville est une coordonnée de latitude, une coordonnée de longitude, et le nom. mon tableau est un tableau avec la classe city. –

+0

Utilisez-vous C ou C++? Est-ce une classe ou une structure? Cela pourrait aussi changer vos réponses. –

Répondre

0

scanf() peut prendre une quantité limitée de caractères avec le spécificateur "%c".

ATTENTION Il ne va pas ajouter un octet nul final.

char cityname[21]; 
scanf("%20c%d%d %c%d%d %c", cityname, 
     &lat1, &lat2, &lat_letter, 
     &lon1, &lon2, &lon_letter); 
cityname[20] = 0; 

Mais vous êtes mieux à l'aide fgets() et analyse de la chaîne « manuellement ». Sinon, vous allez avoir des problèmes de FIN DE LIGNE

+0

Merci pour l'aide., Cela devrait fonctionner correctement. –

1

Voici un indice: Avec des espaces comme seul délimiteur, comment diriez-vous fscanf() où le nom de la ville commence et la latitude commence? Vous vous rapprochez de votre "il semble que cela soit plus utilisé pour lire une ligne entière". Explorez cela, peut-être avec fgets().

+0

donc avec les fgets sont les arguments (inFile, nombre de caractères à balayer, pointeur)? Je me souviens d'avoir entendu parler de cette commade, mais j'oublie comment cela fonctionne. parce que si c'est ainsi que cela fonctionne, pourrais-je simplement mettre fgets (inFile, 20, cityName); ? –

+0

NE PAS utiliser fgets() il ne peut jamais être utilisé en toute sécurité. –

+0

@Heath: voulez-vous dire 'gets()'? – pmg

0

G'day,

Comme vous numérisez jusqu'à ce que le premier numéro, la latitude, pour votre nom de la ville peut-être utiliser un scanner pour les non-numéros pour le premier article?

+0

Comment numériser des non-numéros? –

+0

Utilisez 'isdigit': http://www.elook.org/programming/c/isdigit.html – Jacob

+0

Merci. Je vais essayer. –

0

Si vous avez des espaces dans le nom de votre ville, vous devez utiliser des délimiteurs ou définir le champ du nom de la ville pour qu'il soit fixe. Sinon, essayez d'analyser un nom de ville de trois mots, par ex. "Salt Lake City", va tuer le prochain champ.

0

Juste un indice: lisez toute la ligne en mémoire, puis prenez les 20 premiers caractères pour le nom de la ville, le prochain, disons 10 caractères pour la latitude et ainsi de suite.

+0

Mais je pensais qu'un tableau ne pouvait contenir qu'un seul type. Ne serait-ce pas en combinant ints et chars dans tout ce que je stocke la chaîne de lecture? –

+0

Il veut dire lire toute la ligne en mémoire sous forme de chaîne (c'est-à-dire, lire dans un tableau de char). Une fois que vous avez découpé cela en bits, des fonctions telles que 'strtol' peuvent convertir des chaînes représentant des nombres, en nombres. –

0

Vous pouvez spécifier la taille pour %c qui va collecter un bloc de caractères de la taille spécifiée. Dans votre cas, si le nom de la ville est 20 caractères, saisissez %20c dans le format de ligne scanf.

Ensuite, vous devez mettre terminator à la fin et couper la chaîne.

+0

Cela semble assez facile. Merci. –

0

De "fgets homme":

char * fgets (char * s, int size, FILE * stream); Fgets() lit au moins un caractère de taille inférieure à la taille et stocke dans le tampon pointé par s. La lecture s'arrête après un EOF ou un retour à la ligne . Si un retour à la ligne est lu, il est stocké dans le tampon. Un '\ 0' est stocké après le dernier caractère du tampon. Fs() retourne s en cas de succès, et NULL en cas d'erreur ou lorsque la fin du fichier survient alors qu'aucun caractère n'a été lu.

Cela signifie que vous avez besoin d'un tableau char de 21 caractères pour stocker une chaîne de 20 caractères (le 21ème caractère sera le délimiteur '\ 0' à la fin, et fgets le mettra automagiquement).

Bonne chance!

Questions connexes