2017-09-23 5 views
-1

J'apprends comment utiliser fstream avec dynamic array, le programme censé imprimer toutes les données dans txt file et peut faire quelque chose comme le tri, supprimer le genre ou calculer la moyenne qualité. Mais le code rendu est tout en désordre et les tableaux sont difficiles d'accès.C++ Comment lire un fichier dans un tableau dynamique et accéder aux éléments du tableau

Ceci est l'utilisation du fichier texte pour la pratique. enter image description here

code:

struct studentData{ 
    string branch; 
    string name; 
    char gender; 
    double grade; 
    int number; 
    int total; 
}; 


int main() { 

    int line_count = 0; 
    ifstream file_in; 
    int couter = 0; 
    file_in.open("student.txt"); 
    if(!file_in.good()) 
     { 
      cout << "Eror, could not open the file." << endl; 
      file_in.clear(); 
      return -1; 
     } 
     line_count = openFileTest(file_in); 
     file_in.clear(); 
     file_in.seekg(ios::beg); 
     studentData* p_studentData = new studentData[line_count]; 

    loadStudentData(file_in, p_studentData,couter); 
    displayStudentData(p_studentData, line_count,couter); 

     delete [] p_studentData; 

     file_in.close(); 

     return 0; 
} 


int openFileTest(ifstream& file_in) 
{ 
    string temp; 
    int linecount = 0; 

    while(getline(file_in, temp)) 
    { 
     linecount ++; 
    } 

    return linecount; 

} 

void loadStudentData(ifstream& file_in,studentData* p_studentData,int couter) 
{ 

    int temp ; 
    file_in >> p_studentData -> total ; 
    temp = p_studentData->total; 

    for(int i=0;i<temp;i++) 
    { 
    file_in >> p_studentData->branch >> p_studentData->number ; 
     for(int k=0;k<p_studentData[i].number;k++) 
     { 
      file_in >> p_studentData[k].name >> p_studentData[k].gender >> p_studentData[k].grade ; 
     } 
     p_studentData++; 
    } 
    return; 
} 

void displayStudentData(studentData* p_studentData, int count_line,int couter) 
{ 

     cout << p_studentData->total << endl; 
     int temp = p_studentData->total ; 
    for(int i=0;i<temp;i++) 
    { 
     cout << p_studentData[i].branch << " " ; 
     cout << p_studentData[i].number << endl; 
     for(int j=0;j<p_studentData[i].number;j++) 
     { 
      cout << p_studentData[j].name << " " << p_studentData[j].gender << " " << p_studentData[j].grade << endl; 
     } 
    } 
    return; 
} 

La sortie je reçois est:

enter image description here

+0

[Pour aligner la sortie de lecture sur 'std :: setw'.] (Http://fr.cppreference.com/w/cpp/io/manip/setw) – user4581301

+0

Si votre format de fichier n'est pas encore corrigé, je recommande d'utiliser un analyseur JSON, par exemple https://github.com/nlohmann/json – schorsch312

Répondre

3

Il semble que vous n'êtes pas prudent de suivre où vous êtes dans le fichier. Je ne sais pas pourquoi les tableaux [] sont si populaires pour ce genre de missions lorsqu'un vecteur ferait, mais il faut noter qu'il vous manque un niveau d'abstraction:

votre code: choix de l'étudiant
mission: tableau de assujettir; chaque sujet est un tableau de l'étudiant

Il est souvent très utile d'utiliser des types de garder une trace de ce:

struct student 
{ 
    // as above 
}; 

struct subject 
{ 
    string name; 
    int number_of_students; 
    student* students; 
}; 

struct all_subjects 
{ 
    int number_of_subjects; 
    subject* subjects; 
}; 

Avec cela, nous pouvons travailler sur le déchiffrage du fichier:

all_subjects load_all_subjects() 
{ 
    ifstream f(...); 
    ... 
    all_subjects all; 
    f >> all.number_of_subjects; 
    all.subjects = new subject[ all.number_of_subjects ]; 
    for (int n = 0; n < all.number_of_subjects; n++) 
    load_one_subject(f, all.subjects[ n ]); 
    return all_students; 
} 

void load_one_subject(std::ifstream& f, subject& one_subject) 
{ 
    f >> one_subject.name; 
    f >> one_subject.number_of_students; 
    one_subject.students = new student[ one_subject.number_of_students ]; 
    for (int n = 0; n < one_subject.number_of_students; n++) 
    load_one_student(f, one_subject.students[ n ]); 
} 

Etc. Bonne chance!

+0

Désolé mais le message d'erreur de retour du compilateur "ne peut pas convertir le sujet en objet *" à load_one_subject (f, all.subjects [n]); Ai-je raté quelque chose? –

+0

Désolé, j'ai accidentellement fait de l'argument un pointeur au lieu d'une référence directe. Lors de la programmation, nous devons faire attention au type de chose en tout temps. –