2017-07-31 5 views
1

Affectation d'école. Avoir fondamentalement créer une clé de test pour un examen de conducteur et ensuite valider si oui ou non l'étudiant a réussi l'examen. Les réponses correctes doivent être stockées dans un tableau et les réponses des étudiants et le nom complet doivent être stockés dans un autre tableau à partir de l'entrée de l'utilisateur ainsi que dans un fichier texte. Pendant un moment, j'ai pensé que ce que je faisais était correct jusqu'à ce que j'aille exécuter le programme et j'ai remarqué que peu importe la longueur du tableau, il écrit un étrange caractère avec un accent au-dessus. Il écrit également les bonnes réponses du tableau dans le fichier que je ne veux pas faire. Tout ce que j'ai besoin d'écrire dans le fichier est: (nom complet, réponses des élèves (20), nom complet, réponses des élèves (20), etc.)(C++) Problèmes d'écriture du contenu d'un tableau dans un fichier

La première lettre du fichier est également coupée pour une raison quelconque. (par exemple, "John Doe" devient "ohn Doe") Quelle est la raison de cette erreur? sans l'instruction cin.ignore() je ne sais pas comment obtenir le nom complet dont j'ai besoin dans le fichier.

J'ai défini la taille du tableau en haut comme une constante, ce qui me permet de le remplacer par 4 espaces au lieu de 20 pour un test rapide.

Toute aide est appréciée. Extrêmement nouveau pour la programmation. Profitez-en jusqu'ici juste avoir du mal parfois.

Mon code:

#include <iostream> 
#include <string> 
#include <fstream> 
using namespace std; 

void Correct_Answers(const int SIZE, char correctAnswers[]); 
void Submitted_Answers(const int SIZE, char submittedAnswers[]); 
void Get_Name(string &fullName); 



int main() 
{ 
    const int SIZE = 4; 
    char correctAnswers[SIZE]; 
    char submittedAnswers[SIZE]; 
    string fileName; 
    string fullName; 
    char go = 'Y'; 
    ofstream outputObj; 

    Correct_Answers(SIZE, correctAnswers); 

    cout << "\nEnter the file name: "; 
    cin.ignore(); 
    getline(cin, fileName); 
    outputObj.open(fileName); 


    while (go == 'Y' || go == 'y') 
    { 
     Get_Name(fullName); 
     outputObj << fullName << endl; 

     Submitted_Answers(SIZE, submittedAnswers); 
     outputObj << submittedAnswers << endl; 

     cout << "\nTo process another user enter Y. To quit enter N: "; 
     cin >> go; 
    } 


    cout << "\n\n\n"; 
    system("Pause"); 
    return(0); 
} 

void Correct_Answers(const int SIZE, char correctAnswers[]) 
{ 
    int questionCounter = 0; 

    cout << "\nEnter the correct answers for the drivers exam.\n"; 

    for (int x = 0; x < SIZE; x++) 
    { 
     cout << "\tQuestion #" << ++questionCounter << ": "; 
     cin >> correctAnswers[x]; 
     while (correctAnswers[x] != 'A' && correctAnswers[x] != 'a' && correctAnswers[x] != 'B' && correctAnswers[x] != 'b' && correctAnswers[x] != 'C' && correctAnswers[x] != 'c' && correctAnswers[x] != 'D' && correctAnswers[x] != 'd') 
     { 
      cout << "\tInvalid entry. Re-enter answer: "; 
      cin >> correctAnswers[x]; 
     } 
    } 
} 

void Submitted_Answers(const int SIZE, char submittedAnswers[]) 
{ 
    int questionCounter = 0; 

    cout << "\nWelcome to the written portion of the drivers exam!"; 
    cout << "\nDo your best to answer the questions to the best of your knowledge."; 
    cout << "\n15 out of 20 are needed to pass the exam. Best of luck!\n\n"; 

    for (int x = 0; x < SIZE; x++) 
    { 
     cout << "\tQuestion #" << ++questionCounter << ": "; 
     cin >> submittedAnswers[x]; 
     while (submittedAnswers[x] != 'A' && submittedAnswers[x] != 'a' && submittedAnswers[x] != 'B' && submittedAnswers[x] != 'b' && submittedAnswers[x] != 'C' && submittedAnswers[x] != 'c' && submittedAnswers[x] != 'D' && submittedAnswers[x] != 'd') 
     { 
      cout << "\tInvalid. Re-enter answer: "; 
      cin >> submittedAnswers[x]; 
     } 

    } 

} 

void Get_Name(string &fullName) 
{ 
    cout << "\nEnter the users name: "; 
    cin.ignore(); 
    getline(cin, fullName); 
} 
+1

Avez-vous essayé de parcourir votre code avec un débogueur? –

+0

Je n'ai pas. Je vais essayer que je suis honnêtement juste pas sûr de savoir comment utiliser un débogueur mais je suppose qu'il n'y a qu'une seule façon d'apprendre. Je viens d'utiliser des messages d'erreur du compilateur pour corriger la plupart des choses. –

+2

Les erreurs de compilation sont émises uniquement lorsque le code que vous avez écrit ne peut pas être converti en exécutable. Pas tous les programmes qui compilent - fonctionnent correctement, ou même d'une manière définie.Vous utilisez un débogueur pour le parcourir, ligne par ligne, pour vérifier s'il fonctionne correctement. –

Répondre

0

La raison pour laquelle vous obtenez indésirable lorsque vous écrivez le fichier est que lorsque vous utilisez >> opérateur sur le fichier, l'objet ofstream, vous passez réellement une pointeur, et il continue à lire les caractères jusqu'à ce qu'il trouve une fin de ligne ou d'espace. Par exemple:

int main() 
{ 
    char submittedAnswers[4] = { 'a', 'b', 'c', 'd' }; 
    char * memptr = submittedAnswers; // Points to "abcdÌÌÌ̤ònÉÈø+=" 
    ofstream outputObj ("d:/filetest.txt"); 

    outputObj << submittedAnswers << endl; 
} 

C'est pourquoi il imprime des fichiers inutiles dans le fichier.

La raison pour laquelle vous perdre la première lettre de « John Doe » est parce que vous faites:

cin.ignore(); // This discards the first character. 
getline(cin, fullName); 

Alors pourquoi faites-vous cin.ignore()? Parce que vous pensez que vous devez ajouter cin.ignore() avant de lire une ligne pour que cela fonctionne:

cout << "\nEnter the file name: "; 
cin.ignore(); // You've added this because otherwise getline(cin, fileName) 
       // ends up empty 
getline(cin, fileName); 
outputObj.open(fileName); 

Pourquoi getline() renvoie une chaîne vide si vous laissez cin.ignore()? Parce qu'il y a toujours un caractère de saut de ligne '\ n' dans le tampon cin lorsque vous l'appelez.

Lorsque vous prenez les réponses que vous faites:

cin >> correctAnswers[x]; 

Dans une boucle. Chaque fois que cette ligne l'exécute par défaut, elle ignore les espaces blancs et les nouvelles lignes. Lorsque vous entrez une réponse, vous tapez quelque chose, puis appuyez sur Entrée. Lorsque vous appuyez sur Entrée, il ajoute un '\ n' au tampon. Donc l'entrée de la ligne de commande est insérée dans correctAnswers [], mais sur la dernière cin >> vous vous retrouvez avec un caractère '\ n' à la fin, et c'est pourquoi vous deviez appeler cin.ignore avant d'appeler getline() , pour ignorer ce caractère \ n dans le tampon.