2009-12-10 6 views
0

Mon devoir consiste donc à créer plusieurs classes pour une personne, un nom, un numéro d'identification, une adresse et un numéro de téléphone.Menu texte C++: écriture, lecture et tri des données

Le nom est composé de: Prénom, Milieu et Nom. ID # compose: 9 chiffres. Adresse composée: rue, ville, état et code postal à 5 ​​chiffres. Le numéro de téléphone est le suivant: code régional à 3 chiffres et numéro à 7 chiffres. La personne compose: un nom complet (premier, moyen, dernier), une adresse, un numéro de téléphone (code régional et numéro) et un numéro d'identification (numéro à 9 chiffres).

J'ai accompli tout cela. Mon problème est que nous sommes également supposés faire un menu, spécifier le nombre de personnes que l'utilisateur souhaite taper, où sauvegarder le fichier, s'il veut lire ou écrire dans un fichier spécifié par l'utilisateur, et pouvoir pour trier les personnes par nom (dernier, premier ou milieu) ou par ID # et enregistrer la liste triée dans un fichier spécifié par l'utilisateur.

J'ai tout le code écrit, mais ma fonction d'écriture ne fonctionne pas pour une raison quelconque. Qu'est-ce qui se passe est que je cours le programme, le menu que j'ai créé apparaît. Je sélectionne '1' pour entrer dans le fichier, puis le menu apparaît à nouveau, et je sélectionne '2' pour m'assurer qu'il ne peut pas lire car il n'y a rien dans le fichier spécifique que je suis en train de tester. Ensuite, je sélectionne '3' pour écrire People dans le fichier spécifié par l'utilisateur. Cela m'indique combien de personnes je veux entrer et je saisis un nombre (2). Ensuite, l'invite pour taper le premier nom apparaît et je reçois une erreur « une exception win32 non gérée est survenue » dans mon .exe projet ...

Voici mon code:

//global variables 
char filename[256]; 
fstream file2 (filename); 

int r; 
Person * stuArrPtr=new Person[r]; 

int w; 
Person * stuArrPtr2=new Person[w]; 

//global functions 
void WriteUserFile() { 
//write as many ppl as specified to a file... 
// int w; 
cout << "How many students would you like to enter?: "; 
cin >> w; 

// Person * stuArrPtr2=new Person[w]; 
if (!file2.is_open()) { 
    cout << "File did not open" << endl; 
    file2.clear(); 
    file2.open (filename, ios_base::out); 
    file2.close(); 
    file2.open (filename, ios_base::out | ios_base::in); 

} 
else { 
    for (int i = 0; i < w/*!file2.eof()*/; i++) { 
    stuArrPtr2[i].InputPerson(); 
    if (strcmp(stuArrPtr2[i].PersonNam.GetFirst(), "EOF") != 0) 
    stuArrPtr2[i].Display (file2); 
    } 
} 
cout << endl; 
// delete [] stuArrPtr2; 
} 

void Menu() { 
int option; 
do { 
    //display menu 
    cout << " Type '1' - to open a file for reading or writing" << endl << endl; 
    cout << " Type '2' - to read from the file you specified in '1'" << endl << endl; 
    cout << " Type '3' - to write from the file you specified in '1'" << endl << endl; 
    cout << " Type '4' - sort students by last name" << endl << endl; 
    cout << " Type '5' - sort students by first name" << endl << endl; 
    cout << " Type '6' - sort students by middle name" << endl << endl; 
    cout << " Type '7' - sort students by ID number" << endl << endl; 
    cout << " Type '8' - exit" << endl << endl; 
// cout << " Enter appropriate number here: [ ]\b\b"; 
    cout << " Enter appropriate number here: "; 
    cin >> option; 

    switch(option) { 
    case 1: 
    cout << "you entered option 1" << endl; 
    OpenUserFile(); 
    break; 
    case 2: 
    cout << "you entered option 2" << endl; 
    ReadUserFile(); 
    break; 
    case 3: 
    cout << "you entered option 3" << endl; 
    WriteUserFile(); 
    break; 
    case 4: 
    cout << "you entered option 4" << endl; 
    SortLastName(); 
    break; 
    case 5: 
    cout << "you entered option 5" << endl; 
    SortFirstName(); 
    break; 
    case 6: 
    cout << "you entered option 6" << endl; 
    SortMiddleName(); 
    break; 
    case 7: 
    cout << "you entered option 7" << endl; 
    SortIDNumber(); 
    break; 
    case 8: 
    cout << "you entered option 8" << endl; //exit 
    delete [] stuArrPtr; 
    delete [] stuArrPtr2; 
    break; 
    default: 
    cout << "you screwed up, no big deal, just try again!" << endl; 
    } //end switch 
    //if (option == 6) { 
    // break; 
    //} 
} while (option != 8); 
// system("pause"); 
} 

void main() { 
Menu(); 
} 
/////////////////END OF CODE/////// 

Désolé la le code est si long, et toute aide est très, très appréciée!

+0

Pourriez-vous reformater le code? Il suffit de l'écarter de 4 espaces. – Lucas

+0

pourriez-vous s'il vous plaît re-formater votre code qu'au moins la partie de code est dans 1 bloc? Merci – fritzone

+1

Voici comment vous modifiez votre code: http://stackoverflow.com/editing-help – Lucas

Répondre

1

le problème avec votre code sont les premières lignes. Au démarrage du programme w est probablement initialisé avec 0. Vous créez donc un tableau de zéro Personnes. Au moment où vous appelez stuArrPtr2[i].InputPerson() qui devrait être stuArrPtr2[i]->InputPerson() en passant, vous essayez d'accéder à une fonction membre d'un objet non existant.

Ce que vous aurez à faire est de créer de nouveaux objets Personne en fonction du nombre que vous venez d'entrer comme stuArrPtr2 = new Person[w] dans la fonction WriteUserFile().

Vive Holger

+0

Ok, merci beaucoup! Cela l'a arrangé, et a un sens pour moi maintenant que vous l'avez indiqué. Cependant, maintenant j'ai encore un petit problème. Lorsque j'exécute WriteUserFile(), j'entre le numéro de l'étudiant, et il saute la première invite (entrer le prénom). Donc, la première invite que je peux taper est le deuxième prénom. Pourquoi sauterait-il cette première invite (entrer le prénom)? – nick

+0

depuis que je ne sais pas quelle est la fonction InputPerson() ressemble il est assez difficile de dire ce qui ne va pas ;-) –

+0

bien merci pour toute votre aide j'ai corrigé ce problème avec un cin.getline supplémentaire avant le WriteUserFile() et que fixé le problème! – nick

0

que fait stuArrPtr2[i].Display (file2);?

vous n'avez pas de meilleure façon de vous souvenir de la dernière personne?

if (strcmp(stuArrPtr2[i].PersonNam.GetFirst(), "EOF") != 0) 

comme numéro d'élément dans le tableau ou la liste chaînée.

+0

stuArrPtr2 [i] .Display (file2); affiche les données de la personne dans fichier2 qui est le fichier d'entrée spécifié par l'utilisateur. Et non, je ne sais pas comment se souvenir de la dernière personne ... – nick

+0

donc fondamentalement stuArrPtr2 [i] .Display (file2); écrit les données de la personne dans le fichier d'entrée spécifié par l'utilisateur ... – nick

0

Quelques conseils:

  • utilisation std :: string, pas les tableaux de CHAR
  • ne créent pas des objets en utilisant les nouvelles sauf si absolument nécessaire
  • Renseignez-vous sur la portée - votre le flux de fichier ne doit pas être global
  • principal doit retourner un int
  • penser avant d'écrire le code
+0

Eh bien, vous avez tort à propos de main, mon professeur nous a dit de le faire comme je l'ai fait ci-dessus, et la façon dont vous répondez est considéré comme une vieille et mauvaise pratique ... Vous ne pouvez pas utiliser std :: string sans trop d'effort car la plupart des fonctions que j'utilise requièrent "char *" donc c'est vraiment ma seule option ... Je comprends que la portée de mon flux de fichiers ne doit pas être globale, mais c'est la seule façon dont mon code fonctionnera et je n'ai pas le temps d'écrire une autre classe ... Et j'apprécie vraiment votre dernier commentaire, quel genre de commentaire est-ce !? – nick

+0

Je ne pense pas qu'il vous est arrivé que votre professeur se soit trompé? –

+0

Non, ça ne me vient pas à l'esprit parce que c'est le deuxième professeur que j'ai eu qui me l'a dit. Aussi, quand j'ai visité les collèges il y a quelques mois et que je me suis assis sur plusieurs classes C++, toutes les fonctions principales étaient écrites comme je l'ai écrit ... Même si mon professeur se trompait, pourquoi compile-t-il? – nick

Questions connexes