Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C (C89, C99 und C11) ::  Aus einer Structure löschen?     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Miriam
Unregistrierter




Beitrag Miriam Unregistrierter 10:27:00 22.10.2002   Titel:   Aus einer Structure löschen?            Zitieren

Ich schreibe gerade an einer Art DB-Programm, wo Bücher verwaltet werden sollen. Im Programm läuft alles über eine Structure, von der nur am Anfang und am Ende von/in eine Textdatei geschrieben wird. Es klappt auch alles so ganz gut, aber wenn ich jetzt einen Eintrag in der Structure löschen will, wie mach ich das am besten. Ich habe jetzt schon den Inhalt der Structure mit dem nachfolgenden Wert überschreiben lassen, habe jetzt aber immer den letzten Wert (bzw. Werte) doppelt. Wird irgendwie klar, was ich meine?
Die Funktion:
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
38
39
40
41
42
43
44
45
46
47
48
void daten_loeschen()
{
int z;
if (datei == 0 )
    {
    lesen();
    }
z = (y-1);
for (x=0; ;x++)
    {
    printf(" Welchen Datensatz moechten Sie loeschen (0 zum Beenden)? \n");
    gets(eingabe);
    if (atoi(&eingabe[0]) == 0)        /* 0 beendet die Eingabe */
        {
        break;
        }
    groesse = (atoi (&eingabe[0]));
    x = groesse-1;
    printf(" Das Buch Nr. %i wirklich loeschen? J//N\n", groesse);  /* Sicherheitsabfrage */
    auswahl = getchar();
    switch (auswahl)
        {
        case 'J':
        case 'j':
            if (x == z)
                {
                strcpy(buecher[x].titel,"\0");
                break;
                }
            while (x != z)
                {
                buecher[x].inv_nr = buecher[groesse].inv_nr;
                buecher[x].mwst = buecher[groesse].mwst;
                buecher[x].preis = buecher[groesse].preis;
                buecher[x].stck = buecher[groesse].stck;
                strcpy(buecher[x].titel, buecher[groesse].titel);
                x++;
                groesse++;
                }
        case 'n':
        case 'N':
            break;
        default:
            printf(" Ungültige Taste");
            break;
        }
    }
}

Die Werte sind schon in der Struct, bzw. werden durch den Aufruf von Lesen() in die Struct gebracht. Vielen Dank im Voraus! :rolleyes:
rüdiger
Moderator

Benutzerprofil
Anmeldungsdatum: 11.07.2001
Beiträge: 23067
Beitrag rüdiger Moderator 11:22:00 22.10.2002   Titel:              Zitieren

also du könntest das auch so machen:

-neues Array mit der größe des Bücher Arrays -1 erzeugen
-1. hälfte des Büchers Array rüberkopieren (also alle von 0-[Zu löschenden Eintrag)
-alle Elemente nach dem zu löschenden Eintrag rüberkopieren
-dann den Speicher von buecher freigeben und buecher auf das neue Array zeigen lassen

BTW.
noch einige Probleme/Fehler/Tipps zu deinem Programm:

1.
C++:
gets(eingabe);


gets ist oberpfui, da es leicht zu Bufferoverflows führt, da keine Eingaben länge geprüft wird. Benutz am besten fgets (stdin als Dateihandle), da fgets die länge prüft. Da du aber eh die eingabe nach int umwandelst, kannst du auch direkt scanf nehmen.

2.
C++:
&eingabe[0]

Da verstehe ich den Sinn nicht. Du erhälst ein char, da atoi aber ein char * haben will, trickst du da ein bisschen, da atoi aber bis zu einer 0 oder einem Zeichen liest, wo isdigit false ergibt, liest atoi dann eh über die Grenze des einen chars und geht doch eingabe komplett durch. Also solltest du das weglassen.

3.
C++:
"J//N"

Bei einem / kannst du dir das 2. / sparen, dass brauchst du nur bei \, damit es keine Probleme mit Escape Seuqenzen gibt

4.
C++:
x++;
                groesse++;


Benutze lieber den Präfix ++ Operator, weil dieser idr. schneller oder zumindest gleichschnell wie der Postfix Operator ist

(also ++x anstelle x++)

[ Dieser Beitrag wurde am 22.10.2002 um 11:24 Uhr von kingruedi editiert. ]

_________________
.
Miriam
Unregistrierter




Beitrag Miriam Unregistrierter 11:40:00 22.10.2002   Titel:              Zitieren

Sicher ne gute Idee, aber die Grösse meiner Struct ist variabel.. da ich ja nicht von vorneherein weiss, ob da 2 oder 20 Bücher drinstehen sollen... :(
Sonst noch nen Tip?
Bashar
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.05.2001
Beiträge: 17754
Beitrag Bashar Mitglied 11:45:00 22.10.2002   Titel:              Zitieren

Du redest immer von struct, meinst aber array.

Eine Möglichkeit wär noch, in den struct ein boolsches Flag einzubauen, das auf true gesetzt wird, wenn der Datensatz gelöscht ist. Beim Neueinfügen suchst du dann ein gelöschtes und überschreibst es. Beim Anzeigen und Suchen übergehst du die gelöschten.

Code:
struct Datensatz {
  unsigned geloescht:1;
  /* hier die bisherigen Daten */
  ...
};


Dazu gehört dann noch eine Aufräumen-Funktion, die genau das tut, was kingruedi vorgeschlagen hat, nämlich ein neues Array allozieren und alles was nicht gelöscht ist rüberzukopieren.

_________________
OSL♥
rüdiger
Moderator

Benutzerprofil
Anmeldungsdatum: 11.07.2001
Beiträge: 23067
Beitrag rüdiger Moderator 12:04:00 22.10.2002   Titel:              Zitieren

dann hälst du am besten eine Variable für die Arraygröße bereit. An deiner Stelle hätte ich eh eine doppelt verkettete Liste genommen anstelle eines Arrays, da Einfügen und Löschen dort schneller funktioniert (was bei einer DB ja sehr häufige Zugriffe sind).

@Bashar
C++:
unsigned lala:1;


mittlerweile gibt es doch auch in C (seit C99) einen Bool Type

_________________
.
Bashar
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.05.2001
Beiträge: 17754
Beitrag Bashar Mitglied 12:23:00 22.10.2002   Titel:              Zitieren

der kostet aber mehr Speicher.

_________________
OSL♥
rüdiger
Moderator

Benutzerprofil
Anmeldungsdatum: 11.07.2001
Beiträge: 23067
Beitrag rüdiger Moderator 12:25:00 22.10.2002   Titel:              Zitieren

sicher? Eigentlich sollte das doch Compiler abhängig sein :)

_________________
.
Bashar
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.05.2001
Beiträge: 17754
Beitrag Bashar Mitglied 12:26:00 22.10.2002   Titel:              Zitieren

ein _Bool hat eine Adresse, also muß es mindestens so groß sein wie char

_________________
OSL♥
rüdiger
Moderator

Benutzerprofil
Anmeldungsdatum: 11.07.2001
Beiträge: 23067
Beitrag rüdiger Moderator 12:35:00 22.10.2002   Titel:              Zitieren

hast recht (wie immer :rolleyes: ;))

_________________
.
c++.de :: C (C89, C99 und C11) ::  Aus einer Structure löschen?   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum 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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.