2016-03-11 4 views
1

je dois ouvrir un fichier dans ce formatC de la sstream sauter trois premières entrées d'un fichier

Dat Nguyen 77.7 88.8 99.9 11.1 22.2 

Pat Nguyen 2 3 4 5 6 

Je dois attribuer le premier nom d'une ligne à un tableau de membre de struct et le nom de la ligne à un autre membre de la structure et chaque nombre de la ligne à un tableau de partitions dans la structure et chaque nouvelle ligne va à l'index suivant du tableau struct, en faisant la même chose (Désolé si j'ai mal écrit). J'ai l'attribution du prénom et du nom qui va bien, mais quand il s'agit d'assigner les numéros aux membres de la structure, il saute les trois premiers nombres. Qu'est-ce que je fais mal?

Voici mon code

void fileLoad(Gradebook *students, int &stuCount, int &assignments) 
{ 
ifstream fin; 
fin.open("Scores.txt"); 
if (!fin.is_open()) 
    cout << "Failed to open file.\n"; 

if (stuCount < 10) 
{ 
    int n = 0; 
    string tempLine; 
    string line[10]; 
    while (!fin.eof()) 
    { 
     getline(fin, tempLine); 
     line[n] = tempLine; 
     stringstream ss(tempLine); 
     ss >> students[stuCount].fname >> students[stuCount].lname; 
     assignments = 0; 
     for (int i = 0; tempLine[i] != '\0'; i++) 
     { 
      ss >> students[stuCount].score[assignments]; 
      if (tempLine[i] == ' ') 
       assignments++; 

     } 
     cout << line[n] << endl; 
     assignments--; 
     stuCount++; 
     n++; 
     cout << assignments << endl; 
    } 
} 
else 
    cout << "Already max students.\n"; 
} 

est ici la sortie

Dat Nguyen 77.7 88.8 99.9 11.1 22.2 


Pat Nguyen 2 3 4 5 6 


1. Add a new student to the class 
2. Assign grades for a new assignment 
3. List one student, displaying all their grades and their course average 
4. List all the scores for a chosen assignment 
5. Display all grades currently contained in the gradebook 
6. Save the gradebook to file 
7. Exit the program 
Enter choice: 3 

Enter a student #: 1 

Dat Nguyen 

Assignment 1: 11.1 

Assignment 2: 22.2 

Assignment 3: -9.25596e+61 

Assignment 4: -9.25596e+61 

Assignment 5: -9.25596e+61 

Assignment 6: -9.25596e+61 

Average: -5.28912e+61 
+1

Ne jamais utiliser [ 'while (! Fin.eof())'] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – NathanOliver

+0

@Nathan quoi utiliser à la place? –

+0

Remplace 'while (! Fin.eof())' par while (getline (fin, tempLine)) 'et supprime' getline() 'du corps de la boucle. –

Répondre

0

Ce bit logique est suspect:

for (int i = 0; tempLine[i] != '\0'; i++) 
{ 
    ss >> students[stuCount].score[assignments]; 
    if (tempLine[i] == ' ') 
     assignments++; 

} 

ce itère à travers tous les personnages tempLine un par un et essaie de lire un mot entier de ss. Pensez-y une seconde: pour chaque personnage, lisez tout un mot. ss contient une copie de tempLine mais à part cela, ils sont des entités séparées. Lecture ss en blocs de taille de mot et tempLine en char blocs de taille, les mots seront épuisés longtemps avant la fin de la boucle. et puisque OP ne teste pas la lecture des mots pour le succès, Crom sait seulement ce qui se passe.

Je pense que vous voulez quelque chose comme:

while (assignments < MAX_ASSIGMENTS && 
     ss >> students[stuCount].score[assignments]) 
{ // read all assignments until array full or couldn't read an assignment score 
    assignments++; 
} 

MAX_ASSIGMENTS est un espace réservé pour tout OP utilisé pour la taille du tableau score.