Jusky Geschrieben 23. Januar 2003 Geschrieben 23. Januar 2003 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 Zitieren
g-sus Geschrieben 23. Januar 2003 Geschrieben 23. Januar 2003 wie wärs, wenn du die 1. datei ausliesst 2. einer variable zufügst 3. im programm nur mit der variable arbeitest und 4. bei knopfdruck oder programmende die datei ohne den datensatz überschreibst... Zitieren
Jusky Geschrieben 23. Januar 2003 Autor Geschrieben 23. Januar 2003 Nun, die Theorie ist mir bestens bekannt... 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); Zitieren
Klotzkopp Geschrieben 23. Januar 2003 Geschrieben 23. Januar 2003 Originally posted by Jusky Nur eben das Löschen will einfach nicht klappen.Was geht denn nicht? Compilerfehler? Laufzeitfehler? Unerwünschtes Verhalten? Je genauer du das Problem beschreibst, desto besser können wir helfen. Zitieren
Jusky Geschrieben 23. Januar 2003 Autor Geschrieben 23. Januar 2003 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??? Zitieren
Klotzkopp Geschrieben 24. Januar 2003 Geschrieben 24. Januar 2003 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. Zitieren
Jusky Geschrieben 24. Januar 2003 Autor Geschrieben 24. Januar 2003 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 Zitieren
Klotzkopp Geschrieben 24. Januar 2003 Geschrieben 24. Januar 2003 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. Zitieren
Jusky Geschrieben 24. Januar 2003 Autor Geschrieben 24. Januar 2003 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... Zitieren
Klotzkopp Geschrieben 24. Januar 2003 Geschrieben 24. Januar 2003 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... Zitieren
maxim_42 Geschrieben 24. Januar 2003 Geschrieben 24. Januar 2003 Sieht für mich so aus, als könnte man dem Problem ganz gut mit einer verketteten Liste zu Leibe rücken. Zitieren
Guybrush Threepwood Geschrieben 24. Januar 2003 Geschrieben 24. Januar 2003 Ich glaube hier könnte der komplette Quellcode hilfreich sein um das Problem genau zu verstehen. Es seih denn es spricht etwas dagegen den hier offen zu legen. Zitieren
gugelhupf Geschrieben 24. Januar 2003 Geschrieben 24. Januar 2003 Originally posted by maxim_42 Sieht für mich so aus, als könnte man dem Problem ganz gut mit einer verketteten Liste zu Leibe rücken. Jep, dacht' ich mir auch gerade...oder nen BinBaum nehmen. Zitieren
Jusky Geschrieben 27. Januar 2003 Autor Geschrieben 27. Januar 2003 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 Zitieren
Empfohlene Beiträge
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.