2009-04-01 7 views
0

Je travaille sur un projet de devoirs et j'essaie de stocker des données d'inventaire dans un fichier.Sérialisation des structures

La taille des données d'inventaire ne doit pas être trop grande car techniquement personne ne va vraiment l'utiliser.

J'ai besoin d'écrire ces contenus dans un fichier:

• Description de l'objet • Quantité en main • Prix de gros • Coût au détail • Ajouté au inventaire

Je vais avoir besoin de faire une interface qui me permet de faire ceci:

• Ajouter de nouveaux enregistrements au fichier • Afficher n'importe quel enregistrement dans le fichier • Modifier n'importe quel enregistrement dans le fichier

Struct serait le moyen le plus facile de faire à propos de cet imo. Si je peux juste comprendre comment lire/écrire des structures dans un fichier, cela devrait être vraiment facile.

Si vous pouviez fournir un petit exemple sur la façon de le faire, je l'apprécierais vraiment.

Merci!

Répondre

1

bibliothèque iostream le fait

La classe ofstream fournit l'interface pour écrire des données vers des fichiers sous forme de flux de sortie.

La classe ifstream fournit l'interface pour lire les données à partir de fichiers comme flux d'entrée

Modifier- Example

+0

Je vois comment vous pourriez écrire une structure dans un fichier avec "write" en utilisant ofstream. Mais comment le reluiez-vous? – OneShot

+0

avec l'ifstream ... vous utiliseriez d'abord l'ifstream pour lire un fichier, il peut être vide ... alors écrivez dans le même fichier – TStamper

+0

Pouvez-vous me montrer un exemple sur la façon de faire cela? Juste un petit? – OneShot

0

J'irais avec XML; c'est structuré, c'est basé sur le texte, donc vous pouvez le regarder avec n'importe quel éditeur de texte.

+0

Comment puis-je faire cela .... Pouvez-vous me donner un exemple sur la façon dont Je voudrais lire et corriger cela dans un fichier? – OneShot

2

Demandez à votre professeur, pourriez-vous utiliser la bibliothèque Boost.
Si oui, lisez tutoriel serilization boost, il contient des exemples simples: http://www.boost.org/doc/libs/1_38_0/libs/serialization/doc/tutorial.html

Mais si vous voulez comprendre comment travailler avec des fichiers, vous devez faire cela fonctionne sans aucune aide ou coup de pouce.

Si vous voulez fonctionne avec std :: [io] vous fstreams devez décider quel format vous soutiendrez:
- texte - pour ce cas mieux définir l'opérateur et l'opérateur < < >> et de les utiliser pour la structure à écrire classer ou lire;
- binaire - votre structure doit être POD (données anciennes) et ne doit pas contenir de pointeurs - et vous utiliserez des méthodes de flux en lecture et en écriture.
exemple pour le fichier binaire:
http://www.codeguru.com/forum/showthread.php?t=269648

+0

Non, je ne pense pas qu'il veuille que nous utilisions des bibliothèques supplémentaires. Je prévois de faire cela par moi-même, j'ai juste besoin de comprendre comment lire et écrire des structures ou XML dans un fichier !!! lol – OneShot

+0

sauf une image brute de la structure, il sera plus facile d'utiliser une lib de quelque sorte que de rouler la vôtre. – BCS

+0

Dans la vie d'habitude il est facile et meilleur d'utiliser bien libéré tierce partie lib à la recherche de bicyclette. Mais si vous voulez comprendre le niveau bas - vous devriez utiliser std :: [io] fstreams. – bayda

2

Si cela ne vous dérange pas de niveau très bas, vous pouvez simplement copier les bits struct dans et par la coulée d'un pointeur vers la struct à void* et en utilisant sizeof() pour obtenir le struct longueur.(IIRC leur est un moyen de vider/lire un tampon à vide/à partir d'un fichier)


Notez que ce ne fonctionne que si les données n'a pas de pointeurs/références/etc.


J'aime C's IO mieux que C++ est donc:

typedef struct { int hi; int mon; char[35] dat; } S; 

S s; 
S arr[22]; 
int f; 

// write 
f = open(/* I forget the args*/); 

    // one 
if(sizeof(s) != write(f, &s, sizeof(s))) Error(); 
    // many 
if(sizeof(arr) != write(f, arr, sizeof(arr))) Error(); 

close(f); 

// read 
f = open(/* I forget the args*/); 

    // one 
if(sizeof(s) != read(f, &s, sizeof(s))) Error(); 
    // many 
if(sizeof(arr) != read(f, arr, sizeof(arr))) Error(); 

close(f); 
+0

J'apprécie vraiment votre idée. Pourriez-vous donner un court exemple de la façon de faire cela? – OneShot

+0

@BCS: L'IO ANSI/ISO C est 'fopen', 'fread', 'fwrite'. 'open', 'read', 'write' sont POSIX/K & R C. Oh, et 'open' ressemble à 'open ("newfile.dat", O_CREAT | O_BINARY)' ou 'open ("log.txt", O_RDONLY | O_TEXT) '. –

+0

Alors, c'est si simple? Que se passe-t-il si la valeur entière est 250259 au lieu de 2509, la taille de "s" ne changerait-elle pas, rendant la lecture impossible? – OneShot

Questions connexes