Textdatei verwalten

bibritz

Grünschnabel
Hallo,

ich hab folgendes Problem und kenn mich mit C nur einigermaßen aus. Ich muss für mein Studium ein Programm schreiben, in dem ich eine Hauptstadtdatei verwalten soll. Dabei handelt es sich um eine Textdatei, in der in jeder Zeile das Land, die Hauptstadt, der Kontinent, die Einwohnerzahl, geographische Breite und geographische Länge stehen.
Allerdings komm ich nich klar damit einen Eintrag anzufügen. Die Daten sind dann nur als komische Zeichen in der Datei (binär?). Außerdem funktioniert auch die Suche nach einem bestimmten Land nicht und das Löschen des entsprechenden Datensatzes. Ich bin schon total verzweifelt, weil ich schon ewig nur noch an den Fehlern rumbastel. Vielleicht kann mir ja hier jemand nen Tipp geben, was ich ändern muss. Danke

Code:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>
#include <math.h>

#define ErdRadius 6371
#define Pi 3.14159
#define FALSE 0
#define TRUE !FALSE

struct ortsdaten
{
	char land[30]; char hauptstadt[30]; char kontinent[30];
	long ewz; float breite; float laenge;
};

void read_info(void)
{
	FILE *input;
	struct ortsdaten h;

	if((input=fopen("hauptstadt.txt","r"))==NULL)
	{
		printf("\nFehler beim Oeffnen der Binaerdatei!");
		return;
	}
	else
	{
		while(fread(&h, sizeof(h), 1, input))
			printf("\n%s %s %s %li %.2f %.2f", h.land, h.hauptstadt, h.kontinent, h.ewz, h.breite, h.laenge);
	}
	fclose(input);
}

void eintraganfuegen(void)
{

	FILE *txtdat;
	struct ortsdaten h;
/*	char input[40]; */
	fflush(stdin);
	printf("Land: ");
	gets(h.land);
	printf("Hauptstadt: ");
	gets(h.hauptstadt);
	printf("Kontinent:");
	gets(h.kontinent);
	printf("Einwohnerzahl:");
	scanf("%ld",&h.ewz);
	printf("Breite:");
	scanf("%f",&h.breite);
	printf("Laenge:");
	scanf("%f",&h.laenge);


	txtdat = fopen("hauptstadt.txt","a");
	if (txtdat==NULL)
	{
		puts("Dateifehler");
		exit(1);
	}

	fwrite(&h, sizeof(h), 1, txtdat);

	fclose(txtdat);
	puts("Datensatz hinzugefuegt");
}

long suche(char txtdat[33], char land[30])
{
	FILE *input;
	struct ortsdaten h;
	long pos=-1;

	input = fopen(txtdat, "r");
	if(input==NULL)
	{
		puts("Fehler beim Oeffnen der Datei!");
		return -1;
	}
	else
	{
		do
		{
			fread(&h, sizeof(h), 1, input);
			if(strcmp(land, h.land) == 0)
				pos=ftell(input);
		}while(!feof(input));

		if(pos>0)
		{
			pos-=sizeof(h);
			fseek(input, pos, SEEK_SET);
			fread(&h, sizeof(h), 1, input);
			printf("Datensatz gefunden an Position %ld\n", pos);
			printf("\n%s %s %s %li %.2f %.2f", h.land, h.hauptstadt, h.kontinent, h.ewz, h.breite, h.laenge);
		}
		else
			printf("Datensatz nicht gefunden!\n");
	}
	fclose(input);
	return pos;
}

void eintragaendern(long pos, char txtdat[33])
{
	FILE *fpoi;
	struct ortsdaten h;
	char wahl;
	fpoi=fopen(txtdat,"r+");
	if(fpoi==NULL)
	{
		printf("Fehler beim Oeffnen der Datei!\n");
		return;
	}
	fseek(fpoi, pos, 0);
	fread(&h, sizeof(h), 1, fpoi);
	do
	{
		printf("Kontrolldruck: %s %s %s %li %.2f %.2f\n", h.land, h.hauptstadt, h.kontinent, h.ewz, h.breite, h.laenge);
		printf("Was soll am Datensatz geaendert werden?\n");
		printf("N - Landname\n");
		printf("H - Hauptstadt\n");
		printf("K - Kontinent\n");
		printf("E - Einwohnerzahl\n");
		printf("B - Breite\n");
		printf("L - Laenge\n");
		printf("Q - Beendigung der Korrektur\n");
		printf("Ihre Wahl: ");
		fflush(stdin);		
		wahl = (char)toupper(getchar());
		switch(wahl)
		{
			case('N'):
				printf("\nneuer Landname:"); fflush(stdin); gets(h.land); break;
			case('H'):
				printf("\nneue Hauptstadt:"); fflush(stdin); gets(h.hauptstadt); break;
			case('K'):
				printf("\nneuer Kontinent:"); fflush(stdin); gets(h.kontinent); break;
			case('E'):
				printf("\nneue Einwohnerzahl: "); scanf("%li", &h.ewz); break;
			case('B'):
				printf("\nneue Breite: "); scanf("%f", &h.breite); break;
			case('L'):
				printf("\nneue Laenge: "); scanf("%f", &h.laenge); break;
			case('Q'):
				fwrite(&h, sizeof(h), 1, fpoi);
				fclose(fpoi); break;
			default: 
				printf("\nFalsche Taste!\n");
		}
	}while(wahl != 'Q');
}

void eintragloeschen(long pos, char txtdat[33])
{
	FILE *input, *output;
	struct ortsdaten h;

	if((input=fopen(txtdat,"r"))==NULL)
	{
		puts("Fehler beim Oeffnen der Datei!");
		return;
	}
	if((output=fopen("_tmp","wb"))==NULL)
	{
		puts("Fehler beim Oeffnen der Datei!");
		return;
	}

	while(!feof(input))
	{
		if(pos==ftell(input))
			fseek(input, sizeof(h), SEEK_CUR);
		fread(&h, sizeof(h), 1, input);
		if(!feof(input))
			fwrite(&h, sizeof(h), 1, output);
	}
	fclose(input); fclose(output);
	remove(txtdat);
	rename("_tmp", txtdat);
	printf("Eintrag geloescht!\n");
}

void entfernung (char txtdat[33])
{
	char land1[30], land2[30];
	long pos1=-1, pos2=-1;
	float b1, b2, l1, l2, phi;
	struct ortsdaten h1, h2;
	FILE *input;
	
	printf("\nErstes Land eingeben:");
	fflush(stdin);	
	gets(land1);
	pos1=suche(txtdat, land1);
	if(pos1<0)
	{
		printf("\n %s nicht gefunden!\n", land1);
		return;
	}

	printf("\nZweites Land eingeben:");
	fflush(stdin);	
	gets(land2);
	pos2=suche(txtdat, land2);
	if(pos2<0)
	{
		printf("\n %s nicht gefunden!\n", land2);
		return;
	}
	

	if((input=fopen(txtdat, "r"))==NULL)
	{
		printf("\nFehler beim Oeffnen der Datei!");
		return;
	}

	fseek(input, pos1, SEEK_SET);
	fread(&h1, sizeof(h1), 1, input);
	b1=h1.breite;
	l1=h1.laenge;
		
	fseek(input, pos2, SEEK_SET);
	fread(&h2, sizeof(h2), 1, input);
	b2=h2.breite;
	l2=h2.laenge;
	
	phi=acos(cos(b1*Pi/180)*cos(b2*Pi/180)*cos((l1-l2)*Pi/180)+sin(b1*Pi/180)*sin(b2*Pi/180));
	printf("Die Entfernung zwischen %s und %s beträgt %.2f km\n", h1.hauptstadt, h2.hauptstadt, phi*ErdRadius);
	fclose(input);
}

void weiterefunktion(void)
{
	/*Alle Länder von Datei auf bestimmten Kontinent ausgeben*/
}

void main(void)
{
	char menuepkt, txtdat[33]="hauptstadt.txt", land[30];
	long pos=-1;
	int done=FALSE;
	
	
	while(!done)
	{
		puts("\nMenue-Angebot:\n");
		puts("B - Datei auf Bildschirm ausgeben\n");
		puts("A - Eintrag an das Dateiende anfuegen\n");
		puts("S - Eintrag nach vorgegebenem Land suchen\n");
		puts("K - Komponenten eines zuvor gesuchten Landes aendern\n");
		puts("L - Eintrag loeschen\n");
		puts("E - Entfernung zwischen zwei Orten bestimmen\n");
		puts("G - Weitere sinnvolle Funktion\n");
		puts("Q - Programmende\n");
		printf("Ihre Wahl: ");

		fflush(stdin);		/*vorhandenen Tastaturmüll löschen, damit folgende Anweisung funktioniert*/
		menuepkt = (char)toupper(getchar());

		switch(menuepkt)
		{
			case('B'):
				read_info();
				break;
			case('A'):
				puts("Anfuegen\n");
				eintraganfuegen();
				break;
			case('S'):
				puts("Suche\n");
				printf("Gesuchtes Land: ");
				fflush(stdin);	
				gets(land);
				pos = suche(txtdat, land);
				break;
			case('K'):
				puts("Komponenten aendern\n");
				if(pos<0)
					printf("Erst betreffenden Ort suchen!\n");
				else
					eintragaendern(pos,txtdat);
				break;
			case('L'):
				puts("Loeschen\n");
				if(pos<0)
					printf("Erst betreffenden Ort suchen!\n");
				else
					eintragloeschen(pos, txtdat);
				break;
			case('E'):
				puts("Entfernung\n");
				entfernung(txtdat);
				break;
			case('G'):
				puts("Weitere Funktion\n");

				break;
			case('Q'):
				puts("Programmende\n");
				done=TRUE;
				break;
			default:
				puts("Falsche Eingabe");
				break;
		}
	}
}
 
hat den noch nie jemand von euch ne textdatei mit ner ausgeleen, eingelesen und diese daten in c als struktur verwaltet? würde mir wirklich helfen, wenn ihr mir ein paar tipps gebt.
 
Ich könnt dir höchstens sagen wie de das evntl mit c++ machen knntest,doch hab ich selbst ken plan wie man was dazu schreibt. wenn ich sowas machen würde, müsste ich die datei jedesmal neu schreiben. auser es wird nur gelesen
 
Zurück