lokale Dateien und Index



  • sers leutz,

    ich habe wieder mal ein Problem. Ich hoffe ich kann es einigermaßen erklären. Ich habe eine Konsolen-Datenbank programmiert. Wenn ein neuer Eintrag hizugefügt wird, wird dieser gleich lokal mittels fwrite auf die Festplatte gespeichert. Wenn ich mir nun die gepseicherten Einträge ansehen will, soll er dann aus der lokalen Datei einen Index im Arbeitsspeicher aufbauen.

    struct sData //Wird auf der HD gespeichert
    {
    	char name[30];
    	char stadt[30];
    };
    
    struct sIndex //Index wird im Arbeitsspeicher aufgebaut
    {
    	char name[30];
    	int pos;
    }index[BUFF] = {0};
    

    Mit der folgenden Funktion wird der Index aus der lokalen Datei aufgebaut

    void loadContent()
    {
    	FILE *fPtr = fopen(PATH, "a+b");
    
    	sData *pData = (sData*) malloc(sizeof(sData));
    
    	for (int i=0; i<BUFF; i++)
    	{
    		fseek(fPtr, sizeof(sData)*i, SEEK_SET);
    		if ((fread(pData, sizeof(sData), 1, fPtr)) == 0)
    		{
    			break;
    		}
    		else
    		{
    			if (strcmp(pData->name, "-1\0") != 0 && strcmp(pData->name, index[i].name) != 0 && index[i].pos != -1)
    			{
    				strcpy(index[i].name, pData->name);
    				index[i].pos = sizeof(sData)*i;
    			}
    		}
    	}
    
    	sortArray();
    
    	counter = 0;
    	free(pData);
    	fclose(fPtr);
    }
    

    So nun zum eigentlich Problem. Jetzt gibt es eine Funktion deleteElement

    void deleteElement()
    {
    	int saveInput = 0;
    	FILE *fPtr = fopen(PATH, "rb+");
    
    	printData();
    	printf("Welchen Datensatz m\224chten Sie l\224schen? ");
    	scanf("%d", &saveInput); 
    
    	saveInput--;
    
    	fseek(fPtr, index[saveInput].pos, SEEK_SET);
    	fwrite("-1\0", sizeof(sData),1, fPtr);
    	index[saveInput].pos = -1;
    
    	fclose(fPtr);
    
    	loadContent();
    	_getch();
    }
    

    Wenn diese ein Element löscht, bekommt es lediglich als Position -1 damit es in der Ausgabe ignoriert wird. Allerdings bleibt der Eintrag im Index und das kann bei vielen Einträgen ein Problem werden. Dann würden ja viele "tote" Einträge übrig bleiben. Meine Frage ist nun. Lässt sich das irgendwie umgehen?

    Vielen Dank für die Mühen



  • Du könntest beim Schreiben eines neuen Eintrages die toten Index-Werte neu ausnutzen (und am besten die Lücken in der Datei gleich mit). (d.h. beim Eintragen eines neuen Wertes suchst du den ersten "-1" Eintrag in deinem Index und füllst dort den Namen ein. (dazu mußt du aber die pos-Angabe im Index gültig halten - du könntest stattdessen einen Leerstring als name verwenden)



  • Diesen Tip habe ich vor kurzem schon einmal hier gepostet.

    Beim Löschen kopiere das letzte Element an die Stelle des zu löschenden
    und setze entsprechend die Anzahl der Elemente herab. Du solltest dann
    das gleiche Verfahren auch für die Daten in der Datei durchführen.

    Gruß mcr


Log in to reply