Eingabe und speichern von Daten
-
Hallo,
bisher habe ich mit dem folgenden String, Input für einfache Datenbanken über die Textkonsole aus C++ auf Diskette gespeichert.//
void neuer()
{
char ctaste;
char einstring[80],*endptr;
struct compact
{
char cname[10], cvname[20];
}comp[10];FILE*stream;
stream=fopen("c:\\neu.dat","rb");
fread(&comp,sizeof(comp),1,stream);
fclose(stream);
clrscr();
cout<<" hallo, wollen Sie einen neuen Eintrag vornehmen? Y/N"<<endl;
cin>>ctaste;
...//
Ich wollte Daten direkt auf C speichern mit der folgenden Änderung (siehe Änderung) Leider ohne ErfolgFILE*stream;
stream=fopen("C:\Eigene Dateien:\\neu.dat","rb(bzw. rw)");
fread(&comp,sizeof(comp),1,stream);
fclose(stream);Was muß ich tun?
-
Mit dem Code musst du im ANSI-C Forum fragen.
-
Zum Schreiben auf Disk verwendest du nicht fread(), sondern fwrite()
(und benötigst bei deinem fopen()-Aufruf "wb" oder "ab" (letzteres hängt alles ans Ende der alten Datei an)).
-
Aber muß ich dem Programm den Pfad nicht vorher deklarieren, so wie ich das beschrieben habe?
-
Ja, mußt du - da habe ich auch nichts dagegen gesagt:
stream=fopen(dateiname,"wb");//öffnet zum binären Schreiben //oder stream=fopen(dateiname,"ab");//öffnet binär im Append-Modus fwrite(&comp,sizeof(comp),1,stream);//schreibt die Daten
-
Schau Dir den Ursprungspfad an, merke dass dort der Backslash verdoppelt steht (\), frag Dich kurz warum das so ist (im Zweifel denke "ah, es wird schon einen Sinn haben") und versuche in Deiner Ergänzung auch zwei \ zu benutzen

Achja: Und der Ordner "Eigene Dateien" hat auch keinen Doppelpunkt am Ende oder?
-
Okay das soweit geklappt.
nur wenn ich das ganze loeschen möchte (was C++ auch macht) schreibt er mir trotzdem irgendwelche undefinierbare Zeichen in den einzelnen Spalten rein.
obwohl soweit alles okay ist, odervoid loescheneinzeln()
{struct compact
{
char cname[10], cvname[20];
}com[10];
int ix;
FILE*stream;
stream=fopen("C:\\neu.dat","rb");
fread(&com,sizeof(com),1,stream);
fclose(stream);
clrscr();
cout<<"index eingeben"<<endl;
cin>>ix;
cout<<"loesche Datensatz"<<endl;
com[ix].cname[0]='0';
com[ix].cvname[0]='0';
stream=fopen("C:\\neu.dat","wb");
fwrite(&com,sizeof(com),1,stream);
fclose(stream);
}
-
...und benutz doch bitte bitte [ cpp] Tags

Mit fwrite schreibst Du nicht die Strings einzeln, sondern die komplette Struktur. Also immer mindestens 30 Byte. Wenn Du darin nullterminierte Strings speicherst ist logischerweise nach dem Nullbyte das in der Datei, was vorher drin war (sprich Speichermüll).
Achja, wenn Du den String löschen willst, möchtest Du ihm höchstwahrscheinlich nicht das Zeichen "0" zuweisen, sondern das Nullbyte:
com[ix].cname[0]=0; /* oder */ com[ix].cname[0]='\0';Aber das löst o.a. "Problem" mit fwrite nicht...