Zum Inhalt springen

Datensatz in einer Datei überschreiben


Jusky

Empfohlene Beiträge

Hallo,

ich bin gerade an einem C-Programm, welches Daten (Datentyp ist ein definiertes sruct; Variable ein Array mit 10 Elementen) von Teilnehmern (Name, Vorname, Strasse etc.) einlesen kann. Diese werden dann in eine Datei geschrieben.

Der Anwender hat in dem Programm auch die Möglichkeit, einen bestehenden Datensatz zu löschen. Dazu gibt er die Nummer des Datensatzes ein.

Wie kann ich denn einen Datensatz löschen und wie können die nachfolgenden Datensätze in der Datei aufrücken?

Ich hoffe, ihr könnt mir weiterhelfen.

Dank im voraus! :)

MfG,

Jusky

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nun, die Theorie ist mir bestens bekannt... :rolleyes:

Es klappt auch das Lesen, Ändern und Hinzufügen von Datensätzen. Nur eben das Löschen will einfach nicht klappen. Ich weiß einfach nicht mehr weiter...

Hier mein Ansatz:

printf("Geben Sie die Nummer des, zu loeschenden Datensatzes an: ");

scanf("%i",&iZahl);

i= iZahl - 1;

personen=fopen("E://Teilnehmer//Teilnehmerbearbeiten.txt","w");

//Zählschleife zum Auslesen der nachfolgenden Datensätze

for (iZahl; iZahl < iAnzahl; iZahl++)

{

fscanf(personen,"%d",&Liste[iZahl].iNummer);

fscanf(personen,"%s",Liste[iZahl].cNachname);

fscanf(personen,"%s",Liste[iZahl].cVorname);

fscanf(personen,"%s",Liste[iZahl].cStrasse);

fscanf(personen,"%i",&Liste[iZahl].iPLZ);

fscanf(personen,"%s",Liste[iZahl].cOrt);

}

//Überschreiben des Datensatzes

for (i; i < iAnzahl-1; i++)

{

fprintf(personen,"%d\n",Liste.iNummer);

fprintf(personen,"%s\n",Liste.cNachname);

fprintf(personen,"%s\n",Liste.cVorname);

fprintf(personen,"%s\n",Liste.cStrasse);

fprintf(personen,"%i\n",Liste.iPLZ);

fprintf(personen,"%s\n",Liste.cOrt);

}

fclose(personen);

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nun, so wie ich den Quellcode dort zu stehen habe, klappt es einfach nicht.

Wenn ich z.B.

- 3 Datensätze in die Datei geschrieben habe und davon den 2. löschen

möchte, dann löscht er alle, außer den 2.

- von den 3 Datensätzen den 3. löschen möchte, dann löscht er alle

Kann sein, dass der Fehler leicht zu beheben ist, aber ich sehe den Wald vor Bäumen nicht mehr... :(

Muss ich vielleicht noch ein Array anlegen???

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die stdio-Dateischnittstelle unterstützt AFAIK nicht das Ersetzen von Dateisegmenten mit anderen Daten unterschiedlicher Länge. Du kannst also wohl den Platz, den dein zu löschender Datensatz einnimmt, mit Nullen auffüllen, aber du kannst ihn nicht einfach überschreiben, und hoffen, dass die Datei dadurch kürzer wird. Selbst wenn du die nachfolgenden Datensätze nach vorn verschiebst - ich vermute, dass dein Code das tun soll - ist der letzte Datensatz doppelt vorhanden.

Du könntest - falls die Datei nicht zu lang ist - alle bis auf den zu löschenden Datensatz in eine andere Datei kopieren, die alte Datei löschen und die neue mit dem Dateinamen der alten versehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Geht das wirklich nicht so, wie ich es mir vorstelle? - Ist ja schade... :(

Nun, ich werde das dann halt mal mit den Nullen ausprobieren. Die Idee, die Datei zu löschen und eine neue zu erstellen ist ein bißchen komplizierter. Der Anwender kann das Programm nämlich so oft wiederholen, wie er möchte. Und in vielen Funktionen, die aufgerufen werden, wird noch die alte Datei genommen... Ich kann ja nicht ständig eine neue Datei erstellen lassen, wenn der User einen Datensatz löschen möchte.

Danke für die Hilfe! :)

MfG,

Jusky

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Jusky

Geht das wirklich nicht so, wie ich es mir vorstelle? - Ist ja schade... :(

Mit den C++-Streams sollte es gehen. Kann es auch C++ sein?

Ich kann ja nicht ständig eine neue Datei erstellen lassen, wenn der User einen Datensatz löschen möchte.
Dann könntest du mit Indizes arbeiten, und den nächsten eingefügten Datensatz dahin packen, wo der gelöschte war. Voraussetzung dafür ist allerdings, dass alle Datensätze in der Datei gleich groß sind. Das wiederum würde aber noch andere Vorteile bringen. Du bräuchtest dann nämlich für den Zugriff auf einen bestimmten Datensatz nicht mehr alle vorhergehenden auslesen, sondern könntest sofort an die Startposition des gewünschten Datensatzes springen.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Mit den C++-Streams sollte es gehen. Kann es auch C++ sein?

Nein, ist ausschließlich C.

Dann könntest du mit Indizes arbeiten, und den nächsten eingefügten Datensatz dahin packen, wo der gelöschte war.

Mache ich doch bereits... :confused:

Das mit dem Einfügen kann man schon machen, aber nach dem Löschen kann sich der User ja auch erst einmal alle Datensätze ansehen. Und wenn dann der gelöschte immer noch da ist, nur weil er nicht gleich einen neuen Datensatz eingegeben hat, bringt das auch nichts...

Ich glaube, wir reden hier ständig aneinander vorbei... :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

Originally posted by Jusky

Mache ich doch bereits... :confused:

Kann eigentlich nicht sein, weil die Datensätze in deiner Datei aufgrund der Art und Weise, wie du sie einfügst (zeilenweise) nicht gleich groß sind. Oder machst du eine Verschiebeaktion, wie du sie auch beim Löschen vorhattest?

Und wenn dann der gelöschte immer noch da ist, nur weil er nicht gleich einen neuen Datensatz eingegeben hat, bringt das auch nichts...
Deswegen sagte ich ja, du sollst einen Index erstellen. In dem wäre die Position, an der der gelöschte Datensatz steht, als gelöscht gekennzeichnet.

Ich glaube, wir reden hier ständig aneinander vorbei... :(
Könnte sein...
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

habe jetzt die Lösung. Werde einfach das Array am Anfang mit Nullen füllen und der User kann durch Angabe des Index den Datensatz aussuchen, den er überschreiben und löschen möchte. Beim Löschen wird dann einfach wieder alles auf Null gesetzt und beim Hinzufügen kann man dann den Datensatz wieder füllen...

Die schwere Geburt hat nun ein Ende! ;)

Danke nochmal für die Hilfe!!! :)

MfG,

Jusky

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...