| Autor |
Nachricht |
dukelc4
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.10.2001
Beiträge: 33
|
dukelc4 Mitglied
16:36:00 01.01.2002 Titel: |
StringGrid - komplett abspeichern/einlesen |
Zitieren |
Hallo,
ich bin Anfänger in C++ und möchte als Schulprojekt eine kleine CD-Verwaltung programmieren. Dazu würde ich gerne eine komplette Tabelle eines StringGrid in einer Datei speichern und auch wieder auslesen. Mit hilfe der Borland-Hilfe habe ich es nun geschafft die Zeilen-/Spaltenanzahl und die Strings in der Tabelle in eine Datei zu schreiben. Nun schaffe ich es aber nicht ganz diesen Quellcode so umzuschreiben, das die Werte auch wieder in die korrekte Zelle der Tabelle geschrieben werden. Hier sind noch meine beiden Quellcode für einlesen/ausgeben. Wäre nett wenn mir da jemand weiterhelfen könnte.
[snip]
Ich habe das ganze vorher mit diesen Funktionen versucht:
Laden:
StringGrid1->Rows[StringGrid1->Row]->LoadFromFile("\\cds.txt");
Speichern:
StringGrid1->Rows[StringGrid1->Row]->SaveToFile("\\cds.txt");
Aber damit überschreibt er mir immer die Datei sobald eine neue Zeile gespeichert wird. Gibt es vielleicht eine Möglichkeit das umzuschreiben?
cu
Patrick www.mp3-fiesta.de
[ Dieser Beitrag wurde am 04.01.2002 um 18:56 Uhr von Jansen editiert. ] |
|
|
|
 |
Werbeunterbrechung
|
|
 |
Peter
Mitglied
Benutzerprofil
Anmeldungsdatum: 18.08.2000
Beiträge: 2476
|
Peter Mitglied
23:18:00 01.01.2002 Titel: |
|
Zitieren |
Ist doch klar, dass es nicht so funktionieren kann. SaveToFile kann keinen Fileappend. Musst Dir halt ne entsprechende Speicher-/Ladefunktion selber schreiben. So schwierig ist das doch nicht. Hier ein kleiner Lösungsvorschlag
Speichern eines StringGrids:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | FILE *fp;
int row, rowcount;
rowcount=StringGrid1->RowCount;
// Datei zum Schreiben öffnen
if((fp=fopen("c:\\Data.txt", "w"))==NULL)
{ ShowMessage("Datei konnte nicht geöffnet werden");
return;
}
// Header und Anzahl Zeilen/Spalten schreiben
fprintf(fp, "StringGridData\n%d\n%d\n", rowcount, StringGrid1->ColCount);
// Griddaten schreiben
for(row=0; row<rowcount; row++)
{ fputs(StringGrid1->Rows[row]->CommaText.c_str(), fp);
fputc('\n', fp);
}
fclose(fp); | |
StringGrid laden:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #define SIZEOF_BUFFER 1024
FILE *fp;
int row;
char *buffer=new char[SIZEOF_BUFFER];
// Datei zum Lesen öffnen
if((fp=fopen("c:\\Data.txt", "r"))==NULL)
{ ShowMessage("Datei konnte nicht geöffnet werden");
delete buffer;
return;
}
// Header einlesen und prüfen ob die richtige Datei vorliegt
fgets(buffer, SIZEOF_BUFFER, fp);
if(memcmp(buffer, "StringGridData", 14)!=0)
{ ShowMessage("Keine StringGrid Datendatei !");
fclose(fp);
delete buffer;
return;
}
// Anlahl Rows einlesen und in StringGrid setzen
fgets(buffer, SIZEOF_BUFFER, fp);
StringGrid1->RowCount=atoi(buffer);
// Anlahl Cols einlesen und in StringGrid setzen
fgets(buffer, SIZEOF_BUFFER, fp);
StringGrid1->ColCount=atoi(buffer);
// Griddaten einlesen
for(row=0; fgets(buffer, SIZEOF_BUFFER, fp); row++)
StringGrid1->Rows[row]->CommaText=buffer;
fclose(fp);
delete buffer; | |
[ Dieser Beitrag wurde am 01.01.2002 um 22:20 Uhr von Peter editiert. ] |
Zuletzt bearbeitet von Jansen am 18:17:00 05.08.2003, insgesamt 2-mal bearbeitet |
|
 |
Jansen
Moderator
Benutzerprofil
Anmeldungsdatum: 30.04.2001
Beiträge: 14626
|
Jansen Moderator
00:26:00 02.01.2002 Titel: |
|
Zitieren |
Ahem, ich denke wir sind hier im VCL-Forum, oder nüch?
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | // StringGrid speichern
// Liste, die das Abbild des StringGrids enthalten wird
TStringList *list = new TStringList();
// Spaltenzahl speichern
list->Add(StringGrid1->ColCount);
// Werte zeilenweise in die Liste übertragen
for (int y = 0; y < StringGrid1->RowCount; y++)
list->Add(StringGrid1->Rows[y]->CommaText);
// Liste in Datei speichern
list->SaveToFile("c://test.txt");
// nicht vergessen, den Speicher wieder freizugeben
delete list;
// StringGrid laden
// Liste, die das Abbild der Datei enthalten wird
TStringList *list2 = new TStringList();
// Liste aus Datei laden
list2->LoadFromFile("c://test.txt");
// Zeilen- und Spaltenzahl setzen
StringGrid2->RowCount = list2->Count - 1;
StringGrid2->ColCount = list2->Strings[0].ToInt();
// Werte zeihlenweise aus der Liste übertragen
for (int y = 1; y < list2->Count; y++)
StringGrid2->Rows[y - 1]->CommaText = list2->Strings[y];
// nicht vergessen, den Speicher wieder freizugeben
delete list2; | | |
_________________ Jansen (Mod nur im BCB-Forum)
Zuletzt bearbeitet von Jansen am 18:17:30 05.08.2003, insgesamt 1-mal bearbeitet |
|
 |
Peter
Mitglied
Benutzerprofil
Anmeldungsdatum: 18.08.2000
Beiträge: 2476
|
Peter Mitglied
00:38:00 02.01.2002 Titel: |
|
Zitieren |
  @Jansen
Klar geht das so auch ...
VCL heisst aber nicht, dass man mit aller Gewalt VCL Kompos verwenden muss, oder ? [img]images/smiles/icon_wink.gif[/img]
Warum denn alles nochmal innen Speicher lutschen bzw. zusammenstellen und dann erst schreiben, wenn man das gleich erledigen kann ? Microsoft ist doch schon dem (Haupt-) Speicherwahn verfallen, warum sollen wir dem mit aller Gewalt folgen   |
Zuletzt bearbeitet von Jansen am 18:18:35 05.08.2003, insgesamt 1-mal bearbeitet |
|
 |
Jansen
Moderator
Benutzerprofil
Anmeldungsdatum: 30.04.2001
Beiträge: 14626
|
Jansen Moderator
00:53:00 02.01.2002 Titel: |
|
Zitieren |
VCL heisst aber nicht, dass man mit aller Gewalt VCL Kompos verwenden muss, oder ?
Doch, unbedingt!!!
Naja, ein Vorteil der StringList wäre noch , dass sie "exception safe" (?) ist, man also bequem mit try/catch arbeiten kann. Und das eingebaute Sortieren und Suchen kann man auch immer gebrauchen. :-)
Du siehst schon, ein Programmierer der alten Schule, der um jedes Byte kämpft wird aus mir nicht mehr. |
_________________ Jansen (Mod nur im BCB-Forum)
Zuletzt bearbeitet von Jansen am 18:37:52 05.08.2003, insgesamt 2-mal bearbeitet |
|
 |
Peter
Mitglied
Benutzerprofil
Anmeldungsdatum: 18.08.2000
Beiträge: 2476
|
Peter Mitglied
01:10:00 02.01.2002 Titel: |
|
Zitieren |
@Jansen
Hast recht, es kommt imemr auf den einzelnen Fall drauf an.
Ich hab halt noch auf einem 6502 mit 4kb Hauptspeicher geprogged, da konnte man nicht so grosszügig mitm Speicher umgehen. Irgendwie steckt das immer noch in mir drinnen |
Zuletzt bearbeitet von Jansen am 18:38:22 05.08.2003, insgesamt 1-mal bearbeitet |
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum nicht antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|