11. september 2002 - 10:04
Der er
4 kommentarer
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.
*Struktur1*
"Lars" 25 233 2323 2323 232
"Lene" 20 343 4545 4543 343
*Struktur2*
0001 0002 0013 0004 0987
2323 2323 5454 5455 5656
*Struktur3*
abcd 23bd 45ab 89cf
abca 23b3 45a6 89cf
abcf 23bd 45a8 89cf
MVH
DNA
11. september 2002 - 11:10
#1
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.
11. september 2002 - 11:16
#2
Hej,
Tak for råd, men jeg mangler nogle kendskaber til at lave den, hvis du vil give mig mere info. så jeg tror jeg kan lave den selv.
16. september 2002 - 08:48
#3
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;
}
16. september 2002 - 09:09
#4
Hej Soepro,
Jeg skal nok prøve your kode lige i dag, du får besked når jeg har prøvet.
MVH
DNA8018