Werte aus einer Datei einlesen...

Paule123x

Grünschnabel
hallo allerseits.

ich soll in c wertepaare aus einer datei einlesen die dort folgendermaßen abgespeichert seien sollen:

000.0 000.0
012.0 044.0
002.0 005.0
046.0 013.0

(beispielsweise)
maximal sollen 20 wertepaare eingelesen werden. liegt einer der werte außerhalb des erlaubten bereichs zwischen 0 und 100 soll dem benutzer mitgeteilt werden welcher der werte außerhalb des erlaubten bereichs liegt....

ich habe daraufhin angefangen zu programmieren und mir die datei einfach mal im windows editor erstellt und gespeichert (int mehreren formaten .dat .txt)
leider liest mein programm keine werte ein :mad:
hier einfach mal mein code des unterprogrammes einlesen:
Code:
#include <stdio.h>

int einlesen (double *x[20], double *y[20], int i)

{
    /* Variablen Deklaration*/
int count, erfolg, err, n;
char *datei[30];
FILE *daten;

     
i=0;
count=2;
/* Hier muss noch die Schleife hin die max 5x eingeben lässt! */
do
{
/* Bildschirmmeldung zur Eingabe des Dateinamens */

count=count+1;
printf ("Bitte geben Sie den Namen der Datei ein aus der dir Koordinaten eingelesen werden sollen!\n\n");
scanf ("%c", &datei[30]);
getchar ();
/*Öffnen der Datei*/

daten = fopen ("*datei[30]","r");
/* Einfache Verzweigung beim erfolgreichen öffnen ist die Fehlervar daten != NULL */

if (daten != NULL)
{
          /* schleife mit austrittsbed um werte aus der datei einzulesen */
          do
          {
                  err = fscanf (daten, "%lf%lf", &x[i], &y[i]);
                  /*einfache verzw um zu gucken ob x kleiner 100 ist */
                  if (*x[i] < 100)
                  {
                  /*einfache verzw um zu gucken ob y kleiner 100 ist */
                  if (*y[i] < 100)
                  {
                     i++;        
                  }
                  
                  /* ende einfache verzw um zu gucken ob y kleiner 100 ist */
                  else 
                  {
                       erfolg=0;
                       printf ("Die Koordinate %d liegt ausserhalb des erlaubten Bereiches!\n", y[i]);
                                         
                  }
                             
                  }
                  /*ende einfache verzw um zu gucken ob x kleiner 100 ist*/
                  else 
                  {
                      erfolg=0;
                      printf ("Die Koordinate %d liegt ausserhalb des erlaubten Bereiches!\n", x[i]);
                      
                   }
                   
                   /*  ende schleife mit austrittsbed*/
          } while (err != EOF && i < 20 && erfolg != 0);
          fclose(daten);
          /* einfache Verzweigung um zu testen ob erfolg=0 d.h. keine berechnung möglich */
          if (erfolg==0)
          {}
          else
          {
              /*einfache verzw um zu gucken ob die datei am ende war */
              if (err == EOF)
              {
                      i--;
                      n=i;
                      erfolg=1;
              }
              else 
              {
                   printf ("Nur die ersten 20 Zeilen der Datei wurden eingelesen, da die Datei zu lang ist!\n\n");
                   n=20;
                   erfolg=1;
              }
          }      
          
}        
          
else
{
    erfolg=0;
    printf ("Die von Ihnen angegebene Datei konnte leider nicht geoeffnet werden. Versuchen Sie es erneut!\n\n\n");
    
    getchar ();
    
}
/*Ende der Schleife die max 5x eingeben lässt! */
} while(count != 5 && erfolg != 1);

return erfolg;
}

ich bin c anfänger und muss für die uni programmieren...
ich hoffe einfach mal ganz dreist dass mir hier eventuell jemand weiterhelfen kann....
mittlerweile raucht mir der kopf!:confused::confused:
 
Schreibe den Quellcode mal als Code. Das kannst du im Editor über die Raute(#) machen.
Dann kann man den Code besser lesen.

EDIT1: Bekommst du das Programm bei dir eigentlich zum laufen? Bei mir gibts nen Linkerfehler...
EDIT2: Einen Fehler mit den Pointern scheinst du auch mit drin zu haben...sobald ich das Programm gestartet habe und dann die datei geladen wurde gibts ne Speicherverletzung
 
Zuletzt bearbeitet:
Die zeile ist irgendwie falsch oder?

Code:
daten = fopen ("*datei[30]","r");

Dazu müsste der Dateiname *datei[30] sein...
Das wolltest du sicher nicht ;) Bin mir auch gerade garnich sicher ob man solche namen vergeben darf (unter win).

Dann bin ich mir nicht sicher ob du wirklich nen Array aus 30 Zeigern willst oder lieber nen Array aus 30 Char objekten... Einfach nochmal mit Zeigern beschäftigen ;)

Oder ich hab gerade was falsch vestanden?

EDIT:
Du hast mehrere Fehler drinne (wenn ich mich richtig erinnere). Dein Funktionsaufruf: Soll da nen Array von 20 Zeigern übergeben werden oder 1 Zeiger auf ein Array mit 20 Werten? Dann müsste man das ganze noch klammern: (*x)[20]
 
hallo, danke für die antworten!
@thekiller:
ich bekomme das programm einigermaßen zum laufen. ich kann bloß die werte nicht einlesen. wenn ich einen dateinamen eingebe der nicht existiert, fragt mich das programm, wie gewollt, 5x hintereinander nach einer neuen eingabe. wenn ich eine datei eingebe die existiert werde ich nicht fünfmal gefragt, sondern es wird automtisch 5 mal versucht die datei zu öffnen. ein speicherzugriffsfehler wird mir nicht angezeigt.
@klein0r:
ja das mit den zeigern ist so ne sache, da gebe ich ganz offen zu dass mir da eindeutig das verständnis fehlt! (noch!)
was das programm machen soll ist folgendens, der benutzer soll den namen der datei eingeben aus der dann die wertepaare (koordinaten) eingelesen werden. diese datei soll schon existieren.

wie war das jetzt mit den zeigern? der zeiger *z zeigt auf eine speicheradresse. mit dem kaufmannsund als adressoperator kann ich in diese adresse einen wert reinschreiben? .............


hier dann nochmal der Code...für einlesen
Code:
#include <stdio.h>

int einlesen (double *x[20], double *y[20], int i)

{
/* Variablen Deklaration*/
int count, erfolg, err, n;
char *datei[30];
FILE *daten;


i=0;
count=2;
/* Hier muss noch die Schleife hin die max 5x eingeben lässt! */
do
{
/* Bildschirmmeldung zur Eingabe des Dateinamens */

count=count+1;
printf ("Bitte geben Sie den Namen der Datei ein aus der dir Koordinaten eingelesen werden sollen!\n\n");
scanf ("%c", &datei[30]);
getchar ();
/*Öffnen der Datei*/

daten = fopen ("*datei[30]","r");
/* Einfache Verzweigung beim erfolgreichen öffnen ist die Fehlervar daten != NULL */

if (daten != NULL)
{
/* schleife mit austrittsbed um werte aus der datei einzulesen */
do
{
err = fscanf (daten, "%lf%lf", &x[i], &y[i]);
/*einfache verzw um zu gucken ob x kleiner 100 ist */
if (*x[i] < 100)
{
/*einfache verzw um zu gucken ob y kleiner 100 ist */
if (*y[i] < 100)
{
i++;
}

/* ende einfache verzw um zu gucken ob y kleiner 100 ist */
else
{
erfolg=0;
printf ("Die Koordinate %d liegt ausserhalb des erlaubten Bereiches!\n", y[i]);

}

}
/*ende einfache verzw um zu gucken ob x kleiner 100 ist*/
else
{
erfolg=0;
printf ("Die Koordinate %d liegt ausserhalb des erlaubten Bereiches!\n", x[i]);

}

/* ende schleife mit austrittsbed*/
} while (err != EOF && i < 20 && erfolg != 0);
fclose(daten);
/* einfache Verzweigung um zu testen ob erfolg=0 d.h. keine berechnung möglich */
if (erfolg==0)
{}
else
{
/*einfache verzw um zu gucken ob die datei am ende war */
if (err == EOF)
{
i--;
n=i;
erfolg=1;
}
else
{
printf ("Nur die ersten 20 Zeilen der Datei wurden eingelesen, da die Datei zu lang ist!\n\n");
n=20;
erfolg=1;
}
}

}

else
{
erfolg=0;
printf ("Die von Ihnen angegebene Datei konnte leider nicht geoeffnet werden. Versuchen Sie es erneut!\n\n\n");

getchar ();

}
/*Ende der Schleife die max 5x eingeben lässt! */
} while(count != 5 && erfolg != 1);

return erfolg;
}
 
Zuletzt bearbeitet:
und hier das dazugehörige hauptprogramm:
Code:
#include <stdio.h>
#include <stdlib.h>


int einlesen (double *x[20], double *y[20], int *i);
int main (void)

{
    /* deklarieren der Var */
    int wahl, erfolg, test, *i;
    char auswahl;
    double *x[20], *y[20];
    test=1;
    /* Bildschirmausgabe zur Begruessung */
    printf ("\n\n\tDAS PROBLEM DES HANDLUNGSREISENDEN\n\n"
            "Dieses Programm berechnet die kuerzeste Route ueber eine beliebige Anzahl von Staedten inklusive der Rueckkehr zum Ausgangsort.\n");
    /* Beginn Schleife mit Austrittsbed. */
    do
    {
              /* Auswahlmenue einlesen oder manuell */
            printf ("Waehlen Sie durch druecken der entsprechenden Ziffer\n\n"
                    "(1) Lesen der Staedtekoordinaten aus einer Datei\n"
                    "(2) Manuelle Eingabe der Staedtekoordinaten\n");
            /* switch fuer einlesen oder manuell */
            scanf ("%i", &wahl);
            getchar ();
            
            switch (wahl)
            { 
              case 1:/* aufrufen des unterprog einlesen */
                       
                      einlesen (x, y, i);
                     /* dann einf verzweigung um zu ueberpruefen ob das einlesen erfolgreich war (erfolg=1 wenn ja) */
                     if (erfolg == 1)
                     {
                     
                     /* aufrufen des unterprogs abstand */
                        /* abstand (); */
                     /* aufrufen des unterprogs routenfindung */
                        /* routenfindung (); */
                     }
                     else
                     {
                         /* Fehlermeldung */
                         printf ("\nFehler beim Bestimmen der Koordinaten du ! Keine Berechnung moeglich!\n\n");
                     
                     }
                     break;       
              case 2:/* aufrufen des unterprog eingeben */
                                 /* eingeben (); */
                     /* wieder eine einf verzweigung um zu pruefen ob das eingeben erfolgreich war */
                      if (test == 2) /* (Bedingung die anzeigt ob eingeben erfolgreich) */
                     {
                         
                         
                     /* wenn eingabe erfolgreich dann aufruf der up's abstand und rouetenfindung */
                             /* abstand (); */
                             /* routenfindung (); */
                     }
                     else
                     {
                         /* Fehlermeldung */
                         printf ("\nFehler beim Bestimmen der Koordinaten. Keine Berechnung moeglich! <ENTER> druecken!\n");
                         getchar ();
                     }
                     break;
              
              default:
                      {
                      }
                      
                      break;
            /* switch ende */          
            }       
            /* Menue auf dem Bildschirm ausgeben */
            printf ("\n\n\nWollen Sie eine weitere Route berechnen?\n"
                    " Waehlen Sie 'j' fuer ja oder 'n' fuer nein!\n\n");
            scanf ("%c", &auswahl);
            getchar ();
    /* Ende Schleife mit Austrittsbed. */
   }
   while (auswahl != 'n');
   printf ("\n\nAuf Wiedersehen!\n");
   getchar ();

}
 
Zurück