2014-05-01 3 views
0

J'ai créé un programme simple qui écrit un objet dans un fichier, puis lit ce qui est écrit dans le fichier. Mon problème est quand j'écris dans le fichier les valeurs non désirées sont écrites dans le fichier et quand je récupère les données, ces valeurs sont également récupérées, ce que je ne veux pas.Ecriture/Lecture à partir d'un fichier en C++

Voici ce que je l'ai fait:

Mise en œuvre Gestion des fichiers

//File Handling class Implementation 
File::File(){} 

string File::writeObject(Person obj) 
{ 
    ofstream outFile("myFile.txt", ios::out); 

    if(!outFile) { 
     cout << "No File" << endl; 
    } 

    outFile.write(reinterpret_cast<const char *> (&obj), sizeof(obj)); 
    return "Done"; 
} 

Person.h:

//Person.H 
class Person { 
    private: string name; 
    public: Person(); 
    public: void setName(string name); 
    public: string getName(); 
}; 

Application principale: using namespace std;

int main(int argc, char* argv[]) 
{ 
    Person p1; 
    p1.setName("Shehan"); 

    File f1; 

    cout << f1.writeObject(p1) << endl; //writes to the file 

    ifstream readFile("myfile.txt",ios::in); creates object to read from file 

    string name; // creates variable to hold the value 
    readFile >> name; reads from file 

    cout << name << endl; //prints the value 
    system("pause"); 

    return 0; 
} 

Je pense que "shehan" devrait être écrit dans le fichier, mais ce qui est écrit dans le fichier est:

0ÂÒ Shehan ÌÌÌÌÌ'þ¨ 

Quand je relis:

enter image description here

Ce qui semble être le problème ici?

+1

Vous écrivez le contenu d'un objet non-POD. Cela inclut toutes les variables membres de l'objet _et_ ses sous-objets. Que pensez-vous qu'il va se passer quand une de ces variables membres est un pointeur? –

+0

Je ne vous ai pas vraiment là. –

+1

@ Shehan.W Il essaie de faire remarquer que la représentation interne d'un objet est _not_ text, ou tout ce que vous pouvez éventuellement relire et exploiter. Pensez-y un instant: un 'std :: string' avec 1000 caractères aura toujours un' sizeof' considérablement moins de 100. Où sont tous ces caractères? –

Répondre

3

Ce qui se passe ici, c'est que vous ne formatez pas la sortie. Toutes les sorties doivent être formatées d'une manière ou d'une autre, afin de garantir que vous pouvez les relire; il suffit de copier le motif de bits de la mémoire est inutile.

La manière habituelle de gérer ceci serait de définir un opérateur << (et un opérateur >>, afin de lire) pour votre classe. Cet opérateur affichera tous les éléments individuels de la classe , avec des séparateurs appropriés afin que vous puissiez déterminer où l'un se termine et le suivant commence lorsque vous lisez. Si, par exemple , nous prenons un exemple simple:

class Person 
{ 
    std::string name; 
    int age; 
public: 
    // ... 
    friend std::ostream& operator<<(std::ostream& dest, Person const& obj) 
    { 
     dest << '"' << name << '"' << age; 
     return dest; 
    } 

    friend std::istream& operator>>(std::istream& source, Person& obj) 
    { 
     char ch; 
     source >> ch; 
     if (ch != '"') { 
      source.setstate(std::ios_base::failbit); 
     } 
     std::string name; 
     while (source.get(ch) && ch != '"') { 
      name += ch; 
     } 
     if (ch != '"') { 
      source.setstate(std::ios_base::failbit); 
     } 
     int age; 
     source >> age; 
     if (source) { 
      obj = Person(name, age); 
     } 
     return source; 
    } 
}; 

Vous remarquerez que l'entrée est beaucoup plus difficile que la production. Lors de la sortie, vous savez ce que vous avez (à cause du système de type C++ , et de votre propre vérification des invariants de classe). Lors de la saisie, vous ne savez jamais ce que l'utilisateur va donner vous, vous devez donc vérifier toutes les possibilités. (Vous pourriez, par exemple , veulent interdire des caractères supplémentaires comme un '\n' au nom. Il suffit de les ajouter à l'épreuve dans le while.)

Questions connexes