Gem flere strukturer til en tekst fil og læse tilbage fra den fil
Hej, Jeg bruger builder c++. Er der nogle som kan hjælpe mig med at at gemme flere strukturer til en tekst fil son under, og bagefter hente den fil tilbage til de følgende strukturer igen, jeg giver 100 points for den.
Lav din egen filestream klasse mystream indeholdende en streng-buffer. Definer klassens streaming operatorer (<< og >>) for de simple typer (int, string...) Definer klassens streaming operatorer for de andre klasser, som skal streames (dine strukturer). Her streamer du de enkelte felter manuelt vha. af de operatorer som du definerede før.
Jeg håber, at du kan bruge forklaringen, da jeg ikke har tid til at finde kode-eksempler lige nu.
Hvis du skal kunne genkende de forskellige strukturer i forbindelse med læsningen fra filen, skal de alle have en eller anden ID du kan checke på. Hvad med at lave følgende klasser:
class baseClass { public: int classType; bool readFromFile(FILE *); bool writeToFile(FILE *); baseClass(int type) { classType = type; }; baseClass(void) { baseClass(-1); }; } class struct1 : baseClass { public: struct { char name[20]; int age, t1, t2, t3, t4; } data; bool readFromFile(FILE *); bool writeToFile(FILE *); struct1(char *s, int a, int n1, int n2, int n3, int n4) : baseClass( /*type */ 1) { strncpy(data.name, s, sizeof(data.name)-1); data.age = a; data.t1 = n1; data.t2 = n2; data.t3 = n3; data.t4 = n4; }; }; class struct2 : baseClass { public: struct { int t1, t2, t3, t4, t5; } data; bool readFromFile(FILE *); bool writeToFile(FILE *); struct2(int n1, int n2, int n3, int n4, int n5) : baseClass(/* type */ 2) { data.t1 = n1; data.t2 = n2; data.t3 = n3; data.t4 = n4; data.t5 = n5; }; };
hvor readFromFile() metoden så var tilpasset den enkelte klasse:
bool struct1::readFomFile(FILE *inpFile) { // classType *ER* allerede læst - ellers kunne vi jo ikke vide at // det var denne type klasse. if (fread(this->data, sizeof(this->data), 1, inpFile) != 1) return false; return true; } // readFromFile
tilsvarende for writeToFile():
bool struct1::writeToFile(FILE *outFile) { // Skriv både aktuelle klasse type (tildelt ved instatiering af variablen // se constructor ovenfor. if (fwrite(this->classType, sizeof(this->classType), 1, outFile) != 1 || write(this->data, sizeof(this->data), 1, outFile) != 1) return false; return true; } // writeToFile
Du kan du så læse/skrive til/fra en fil sådan her:
#include <stdio.h> int main(void) { FILE *structFile; baseClass vBase; struct1 vS1[2]; int nbrS1; struct2 vS2[4]; int nbrS2;
if ((structFile = fopen("C:\\structs.fil", "r+b")) == NULL) { // Struktur fil ikke fundet - afslut med fejl. return -1; };
// Læs de forskellige strukturer. nbrS1 = 0; nbrS2 = 0; while (!structFile->eof) { if (fread(&vBase, sizeof(vBase), 1, structFile) != 1) { // FEJL fclose(structFile); return -1; };
// Vælg klasse i henhold til just læse type. switch (vBase.classType) { case 2 : // struct2 if (!vS2[nbrS2].readFromFile(structFile)) return -1; nbrS2++; break; case 1 : // struct1 if (!vS1[nbrS1].readFromFile(structFile)) return -1; nbrS1++; break; default: // UKENDT klassetype, kun -1 er så tilladt. (Den indeholder // kun baseClass - alle andre varianter kender vi ikke.) if (vBase.classType != -1) return -1; break; }; // Swicth on type }; // Until EOF
// Behandl dine forskelluge strukturer. : :
// Skriv dem tilbage til filen. (Flyt først pointer tilbage til starten.) if (fseek(structFile, 0, SEEK_SET) != 0) { fclose(structFile); return -1; }
for (int idx = 0; idx < nbrS1; idx++) if (!vS1[idx].writeToFile(structFile)) { // FEJL fclose(structFile); return -1; };
for (int idx = 0; idx < nbrS2; idx++) if (!vS2[idx].writeToFile(structFile)) { // FEJL fclose(structFile); return -1; };
// Luk filen og afslut normalt. fclose(structFile); return 0; }
Jeg skal nok prøve your kode lige i dag, du får besked når jeg har prøvet.
MVH DNA8018
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.