2017-01-15 2 views
0

Bonjour, j'essaie de lire dans un fichier binaire que j'ai créé à partir d'un autre jeu de codes. Par exemple. En utilisant A.cpp pour créer le fichier binaire et en utilisant B.cpp pour lire le fichierLecture d'un fichier binaire créé par un autre jeu de codes C++

Par exemple: dans A.cpp j'ai créé un fichier en utilisant avec la structure suivante ci-dessous

struct assignment 
{ 
    char atitle [MAX]; 
    int weight; 
    int markupon; 
    double marks;  
}; 

struct subjects 
{ 
    char code [MAX]; 
    char subtitle [MAX]; 
    int NoOfTask; 
    assignment AStructure [MAX]; 
    int finalmarks; 
    grades grade; 
}; 

En A. cpp j'utilise le code suivant pour obtenir le nombre d'enregistrements que j'ai dans le fichier et ça marche bien.

int getNoOfRecords (fstream& afile, char filename []) 
{ 
    afile.open (filename, ios::in | ios::binary); 

    if (!afile) 
    { 
     afile.close(); 

     return 0; 
    } 

    // move read marker point to end of 
    // the last record 
    afile.seekg (0, ios::end); 

    int totalBytes = afile.tellg(); 

    int noOfsubjects = totalBytes/sizeof (subjects); 

    afile.close(); 
    return noOfsubjects; 
} 

En B.cpp i ont les structures suivantes

struct studentassignment 
{ 
    char atitle [MAXN]; 
    int weight; 
    int markupon; 
    double marks;  
}; 

struct studentsubjects 
{ 
    char code [MAXN]; 
    char subtitle [MAXN]; 
    int NoOfTask; 
    studentassignment AStructure [MAXN]; 
    int finalmarks; 
    char grade [MAXN]; 
};* 

Et B.cpp j'utilise le code ci-dessous pour obtenir le nombre de dossiers, mais les résultats im obtenir est différent de ce que je reçois dans A.cpp. Par exemple: J'entre 3 jeux de données dans A.cpp, quand je lis de B.cpp je reçois seulement une taille de 2. Les données qui sont lues dedans du dossier sont incorrectes aussi.

int NoOfRecords (fstream& afile, char filename []) 
{ 
    afile.open (filename, ios::in | ios::binary); 

    if (!afile) 
    { 
     afile.close(); 

     return 0; 
    } 

    afile.seekg (0, ios::end); 

    int totalBytes = afile.tellg(); 

    int noOfsubjects = totalBytes/sizeof (studentsubjects); 

    afile.close(); 
    return noOfsubjects; 
} 

Y at-il quelque chose qui im ​​faire le mal ou est-il aucun moyen de lire dans le fichier en utilisant un fichier cpp différent ?? Je suis seulement un débutant au C++ si je me trompe à quoi que ce soit pls faites le moi savoir. merci à l'avance

MVCE

A.cpp

#include <iostream> 
#include <fstream> 
#include <cstdlib> 
#include <ctime> 
#include <iomanip> 

using namespace std; 

const int MAX = 80; 

enum grades {HDist, Dist, Credit, Pass, Fail}; 


struct assignment 
{ 
    char atitle [MAX]; 
    int weight; 
    int markupon; 
    double marks;  
}; 


struct subjects 
{ 
    char code [MAX]; 
    char subtitle [MAX]; 
    int NoOfTask; 
    assignment AStructure [MAX]; 
    int finalmarks; 
    grades grade; 
}; 

int main() 
{ 

    afile.open ("filename.dat", ios::out | ios::binary); 
    afile.seekg (0, ios::end); 

    subjects s; 

    cout << "Subject Code: "; 
    cin >> s.code;  
    cout << "Subject Name: "; 
    cin.ignore(); 
    cin.getline(s.subtitle, MAX); 
    cout << "No of assessment task: "; 
    cin >> s.NoOfTask; 
    cout << endl; 
    for (int i = 0; i < s.NoOfTask; i++) 
    { 
     cout << "Task " << i+1 << " information" <<endl; 
     cout << "Title: "; 
     cin.ignore(); 
     cin.getline(s.AStructure[i].atitle, MAX); 

     cout << "Weight: "; 
     cin >> s.AStructure[i].weight; 
     cout << "Upon: "; 
     cin >> s.AStructure[i].markupon; 
     cout << endl; 
     s.AStructure[i].marks = 0; 

     total = total + s.AStructure[i].weight; 
    } 

    afile.write (reinterpret_cast <const char *>(&s), sizeof (subjects)); 

    afile.close(); 
} 

B.cpp

#include <iostream> 
#include <fstream> 
#include <cstdlib> 
#include <ctime> 
#include <iomanip> 


using namespace std; 

const int MAXN= 80; 
const int MAXN0= 10; 

struct studentassignment 
{ 
    char atitle [MAXN]; 
    int weight; 
    int markupon; 
    double marks;  
}; 

struct studentsubjects 
{ 
    char code [MAXN]; 
    char subtitle [MAXN]; 
    int NoOfTask; 
    studentassignment AStructure [MAXN]; 
    int finalmarks; 
    char grade [MAXN]; 
}; 

int NoOfRecords (fstream& , char []); 
void getrecord(fstream& afile, char filename [] , int, studentsubjects); 

int main() 
{ 
    fstream afile; 
    subjects b; 
    int size; 

    size = NoOfRecords (afile, "filename.dat"); 
    cout << size << endl; 

    for (int i = 0; i < size; i++) 
    { 
     getrecord(afile, "filename.dat", i+1, b); 
     cout << b.code << endl; 
    } 

} 


int NoOfRecords (fstream& afile, char filename []) 
{ 
    afile.open (filename, ios::in | ios::binary); 

    if (!afile) 
    { 
     afile.close(); 

     return 0; 
    } 

    afile.seekg (0, ios::end); 

    int totalBytes = afile.tellg(); 

    int noOfsubjects = totalBytes/sizeof (studentsubjects); 

    afile.close(); 
    return noOfsubjects; 
} 

void getrecord(fstream& afile, char filename [], int i, studentsubjectsb) 
{ 
    afile.open (filename, ios::in | ios::binary); 



    afile.seekg ((i) * sizeof (studentsubjects), ios::beg); 

    afile.read (reinterpret_cast < char *>(&b), sizeof (studentsubjects)); 

    afile.close(); 

} 
+0

Il serait utile d'utiliser pour fournir un [MVCE] (http://stackoverflow.com/help/mcve) –

+0

@EdHeal salut je modifie mon post pls laissez-moi savoir si vous avez besoin d'autre chose merci beaucoup –

+0

S'il vous plaît affiner la problème beaucoup plus –

Répondre

1

Le dernier membre struct subjects (utilisé dans A.cpp) est grade et il devrait être autour de 1-8 octets.
Le dernier membre de la structure studentsubjects (utilisé dans B.cpp) est char[80] et il doit être de 80 octets. Cela signifie que la structure en B.cpp sera plus grande qu'une en A.cpp. Par conséquent, si le même nombre d'octets est donné et que la taille est égale à trois struct subjects, il ne suffira pas pour trois struct studentsubjects. Pour éviter ce type d'erreur, vous devez écrire les déclarations des structures à lire et à écrire dans un fichier d'en-tête et utiliser le fichier d'en-tête des codes source qui lisent et/ou écrivent les structures.

+0

Salut @MikeCAT en fait ce 'A.ccp' et 'B.ccp' est dans le même projet avec 'Ah' et 'B.h', il a essayé de déclarer le même 'grade' et structure en ' Bh 'de' Ah 'mais beaucoup d'erreur de duplication est apparue. par conséquent j'ai re-déclaré les structures. Y at-il quelque chose que je peux faire pour utiliser la même énumération dans les deux fichiers d'en-tête? –