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
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;
}
}
}