2017-09-30 6 views
-2

J'ai un fichier texte qui ressemble à ceci:fonction Write qui accepte les variables de pointeur et et attribue des valeurs de fichier à struct en C

Temba Bavuma 10.05 Hashim Amla 5.04Dale Steyn 16.78 

Je me donne un struct dans le fichier d'en-tête séparé qui ressemble à:

#ifndef APARTMENTS_H_ 
#define APARTMENTS_H_ 

struct apartmentData 
{ 
    char ownerName[30]; 
    char ownerSurname[30]; 
    double tariff; 
}; 
typedef struct apartmentData ApartmentData; 

#endif 

-je utiliser la fonction suivante pour attribuer trois appartements différents les valeurs du fichier texte et la fonction ne doit pas produire une sortie:

void readMetadataFromFile(ApartmentData *data1, ApartmentData *data2, ApartmentData *data3);   

Les appartements sont affectés leurs valeurs grâce à cette fonction dans mon main.c. Il existe un fichier d'en-tête différent pour la fonction et la structure de l'appartement. La fonction a son propre fichier .c.

Je ne sais pas comment ajouter les valeurs aux différents appartements. Je comprends comment ouvrir un fichier et lire dans les valeurs. Je ne comprends pas comment assigner trois appartements à leurs valeurs appropriées à travers une fonction avec cette structure et pointeur. Je dois utiliser ce prototype de fonction tel quel. Puis-je avoir une aide s'il vous plait?

+2

Qu'avez-vous essayé? Où avez-vous échoué? À l'heure actuelle, la question tend à être large. – alk

+0

Lors de la frappe, toutes les données étaient sur une seule ligne. Est-ce vraiment la façon dont les données sont présentées dans le fichier, ou le fichier a-t-il trois lignes? Vous avez lancé le '5.04' dans' Dale' sans espace; est-ce vraiment la façon dont les données sont présentées? Il peut être traité avec 'fscanf()' comme indiqué, mais ce n'est pas la manière dont je m'attendrais à voir les données. IMO, vous aurez besoin d'une fonction supplémentaire qui lit un enregistrement du fichier, et vous passerez les trois pointeurs différents dans trois appels distincts à la fonction unique. Agir autrement serait une répétition ridicule. –

+0

Afficher la définition de la fonction 'readMetadataFromFile()' –

Répondre

1

Si vous voulez juste lire à partir du fichier texte dans les variables ApartmentData en utilisant la fonction void readMetadataFromFile(ApartmentData *data1, ApartmentData *data2, ApartmentData *data3); que vous pourriez faire

void readMetadataFromFile(ApartmentData *data1, ApartmentData *data2, ApartmentData *data3) 
{ 
    FILE *fin=fopen("apartment.txt", "r"); 
    if(fin==NULL) 
    { 
     perror("Error"); 
     return; 
    } 
    fscanf(fin, "%29s %29s %lf", data1->ownerName, data1->ownerSurname, &data1->tariff); 
    printf("\n\n%s %s %lf", data1->ownerName, data1->ownerSurname, data1->tariff); 

    fscanf(fin, "%29s %29s %lf", data2->ownerName, data2->ownerSurname, &data2->tariff); 
    printf("\n\n%s %s %lf", data2->ownerName, data2->ownerSurname, data2->tariff); 

    fscanf(fin, "%29s %29s %lf", data3->ownerName, data3->ownerSurname, &data3->tariff); 
    printf("\n\n%s %s %lf", data3->ownerName, data3->ownerSurname, data3->tariff); 

    fclose(fin); 
} 

Vous devez également vérifier la valeur de retour du fscanf() pour voir si les affectations ont réussi.

Dans ce cas, chacun des fscanf() doit renvoyer 3, ce qui correspond au nombre d'affectations réussies. Si ce n'est pas 3, une erreur est survenue.

L'opérateur -> permet d'accéder au contenu d'un struct via un pointeur.

Modifier: chux a souligné qu'il existe des chances de débordement avec fscanf().

Étant donné que les tailles des membres de la chaîne de la structure est 30, utilisez "%29s" en lisant en leur permettant le caractère \0 indiquant la fin de la chaîne.

Sinon, si une chaîne de taille supérieure à celle de la matrice de caractères est fournie, la mémoire hors limites de la matrice sera écrasée, invoquant un comportement indéfini.

+1

C'est beaucoup plus simple que ce que j'avais. Merci beaucoup – Brood

+0

'fscanf (fin,"% s% s% lf ",,,' a des problèmes de débordement de tampon similaires à ceux maintenant obsolètes 'gets()'. Mieux vaut limiter l'entrée avec 'fscanf (fin,"% 29s % 29s% lf "...' – chux

+0

@chux Merci de m'avoir signalé. –

0

Si elle lools comme celui-ci Temba Bavuma 10.05 Hashim Amla 5.04 Dale Steyn 16.78 (avec un espace entre 5,04 et Dale) Je vous conseille, vous faites une autre fonction

void fill(ApartmentData *data, File* f) 

et appelez à l'intérieur readMetadataFromFile 3 fois comme ça

fill(data1,f) 
fill(data2, f) 
fill(data3, f) 

Dans cette fonction. Après avoir lu les valeurs char* name, char * surname et double tariff (que vous savez comment faire), assigner

data->ownerName=name; 
data->ownerSurname=surname ; 
data->tariff=tariff;