will nicht kopieren !

murdi

Erfahrenes Mitglied
will nicht verschieben !

Also erstema frohe Ostern an alle :)

Ich hab folgendes Problem, wir soll so eine Art kleines Schuelerverwaltungsprogramm schreiben wo man schueler hinzufuegen kann, löschen editieren , sicherheitskopie anfertigen , klassendruchschnitt ausrechnen , schuelerdurchschnitt errechen unsw.

Habe eigentlich schon fast alles nur beim loeschen gibt es einiges Probleme das folgender Maßen aussieht !

Er kopiert zwar die Daten in die Zwischendatei aber von dort aus überschreibt er nicht die Hauptdatei was irgendwie komisch ist.

hier der code !

void schueler_loeschen( void )
{
FILE *pLoeschen;
FILE *pZwischenspeicher;

int i = 0;
int iID = 0;

fpos_t sprung;

pLoeschen = fopen(DATEINAME,"r");

if(!pLoeschen)
{
perror("Fehler beim lesen der Datei\n");
}
else
{

printf("Geben Sie ID des Schuelers ein der geloescht werden soll <");
scanf("%i",&iID);


pZwischenspeicher = fopen(ZWISCHEN,"w");

for( i = 0; i < anzahl(); i++)
{
if(i == iID-1)
{
printf("geloescht\n");
}
else
{
sprung = sizeof(schueler) * i;
fsetpos(pLoeschen,&sprung);
fread(&schueler,sizeof(schueler),1,pLoeschen);
fsetpos(pZwischenspeicher,&sprung);
fwrite(&schueler,sizeof(schueler),1,pZwischenspeicher);

printf("%s\n",schueler.sVorname);
}
}

fclose(pZwischenspeicher);
fclose(pLoeschen);

pLoeschen = fopen(DATEINAME,"w");
pZwischenspeicher = fopen(ZWISCHEN,"r");

for(i = 0; i < anzahl()-1; i++)
{
sprung = sizeof(schueler) * i;
fsetpos(pZwischenspeicher,&sprung);

fread(&schueler,sizeof(schueler),1,pZwischenspeicher);

fwrite(&schueler,sizeof(schueler),1,pLoeschen);
}

fclose(pZwischenspeicher);
fclose(pLoeschen);



}

}


in der Funktion anzahl() die ab und zu auftaucht werden nur die vorhandenen eintraege gezaehlt !


also , vielleicht findet jemand nen fehler !


Viel spass noch beim eier suchen !
 
Zuletzt bearbeitet:
Hab leider im Mom. keine Zeit den Code genau anzuschaun, was mir allerdings aufgefallen ist (und der oder mit ein Grund sein könnte): Du liest alle Elemente aus Der Quelldatei, überspringst beim Schreiben in die Zieldatei das zu löschende Element, allerdings wird der Index brav weiter erhöht, das heißt du schreibst an der einen Stelle nichts in die Zieldatei (?) -> vermutlich unitialisierte Daten an der Stelle an der ursprünglich das zu löschende Element war, hmm wenn ich mir das so anschaue sieht's fast so aus, als ob der zu löschende Schüler durch ncihts oder undefinierte Werte ersetzt wird, während der letzte gelöscht wird.

Ahja, nochetwas: Von der Effizienz her ist das Programm (auch unter der Annahme, dass du keine Kopie im Speicher haben darfst) miserabel.
Es ginge sogar ohne Zwischendatei mit ... entweder "ein paar" fread()/fwrite() (unter der Annahme das du maximal einen Datensatz im Speicher haben darfst), oder falls du belieibig viele Datensätze im Speicher halten darfst, wenn ich mich nicht irre mit 1x fread()/fwrite()... Wie, das überlass ich dir (Tipp: die beiden fread()/fwrite würden ein "Move" (innerhalb der Datei) simulieren)
 
also danke erstma für deine hilfe !! :)

könntest du mir eventuell noch ein paar tipps geben bzw tipps zur realisierung des programmes die auch aus der sicht der effizients her
halbwegs korrekt sind ?

kannst mich ja mal im icq adden :)

tschau schö abend noch !
 
Prinzipiell, das wichtigste ist: mit fread() / fwrite() kannst du auch große Blöcke einlesen/schreiben, das löschen ginge so, dass du einfach dei ganzen Blöcke hinter dem zu löschendem Objekt (mit ein oder mehreren fread() ausliest und sie an der Position des zu löschenden Objektes (mit fwrite) wieder schreibst, also den Block dahinter effektiv um 1 Position vorverschiebst (über den zu löschenden Schüler drüber)
 
mhh , das wichtigste an diesem programm ist das das alles in einer zwischendatei abgelegt wird.

die zwischendatei dient als backupdatei falls mal das progi crasht oder die hauptdatei beschädigt wird !
 
jop , haste da vielleicht nen paar tipps wie man das ganze etwas schneller und eventuell noch sicherer machen kann ?
 

Neue Beiträge

Zurück