Einzelnen Beitrag anzeigen

silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#1

[C] Erfolg prüfen ohne Rückgabewert

  Alt 11. Jan 2008, 14:43
Hallo zusammen,

wir müssen als Leistungsnachweis in Info ein kurzes Programm, welches sich um Pointer dreht, schreiben.
Dazu haben wir vom Prof. eine Methode bekommen, um Daten aus einer Textdatei in ein "Array of Pointer" einzulesen.
Code:
char *stringFeld[12][5]
Dummerweise sieht die Signatur dieser Methode so aus:
Code:
void createStringFeld(char *daten[12][5]);
soll heißen, sie hat keinen Rückgabewert, anhand dessen man überprüfen könnte, ob das stringFeld richtig befüllt wurde. Und wir dürfen auch die Methode nicht verändern (und z.B. einen Rückgabewert einbauen).

Die Methode an sich sieht so aus:
Code:
void createStringFeld(char *daten[12][5]){ 
   FILE *pFile = fopen("daten.txt", "r");
//   int zeilen=12; //Von mir Auskommentiert, da nicht verwendet
   int spalten=5;
   char file[20] = "Daten.txt";
   char zeichen[2];
   int i=0, zeile,spalte;
   char *zString =(char *) malloc(2*sizeof (char));
   zString[0] = '\0';
   if (!pFile) {
      printf(" Fehler beim Oeffnen der Datei %s\n", file);
      return;
//-> hier hätte ich sonst den RückgabeWert eingebaut
   }
   zeichen[1] = '\0';
   zeichen[0] = fgetc(pFile);
   while(!feof(pFile)){
      // evtl vorhandene Leerzeichen auslesen
      while(zeichen[0] == ' '|| zeichen[0] =='\n'){
         zeichen[0] = fgetc(pFile);
      }
      //printf("---> %c", zeichen[0]);
      while ((zeichen[0] != ' ' && zeichen[0] != '\n') && !feof(pFile)){
         zString = (char*)realloc(zString,strlen(zString)+ 2* sizeof (char));
         strncat(zString,zeichen,1);
         zeichen[0] = fgetc(pFile);
      }
      strcat(zString,"\0");
      zeile = (int) i/spalten;
      spalte = i%spalten;
      daten[zeile][spalte] = zString;
      i++;
      // zString neu initialisieren
      zString =(char *) malloc(2*sizeof (char));
      zString[0] = '\0';
   }
   fclose(pFile);
   return ;
}
Lange Einleitung, lange Frage...
Wie kann ich nun den Fehler abfangen, dass die Daten gar nicht eingelesen wurden (z.B. weil die Datei fehlt...).

Ich habe mir jetzt so beholfen (Ausschnitt aus der main Methode):
Code:
   createStringFeld(stringFeld);
   if (**stringFeld[0] != 'K') {
      printf("StringField not filled! Abort...");
      return EXIT_FAILURE;
   }
   ...
Da ich die Daten kenne und weiß, dass als erstes der Name "Kraemer" im stringFeld steht, teste ich eben zur Zeit, ob der erste char das "K" ist.

Sonderlich hübsch finde ich das nicht, bei meinem (sehr) begrenzten Wissen will mir aber nichts Schöneres einfallen.
Ich wäre also dankbar, wenn sich jemand diesen Codeschnipsel mal anschauen und mir sagen könnte, ob das so in Ordnung ist, was ich mache.

p.s. Da es sich hier ja um einen Leistungsnachweis handelt, den ich "allein" machen soll, bitte ich darum, dass mir hier keine Lösungen o.Ä. präsentiert werden, sondern "nur" Denkansätze, wie ich weiter vorgehen kann/soll.

p.p.s: warum ich in dieses Forum schreibe, und nicht in ein C/C++ Forum?
-> Weil ich weiß, dass Ihr kompetent genug seid
-> Weil ich kein C/C++ Forum kenne
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  Mit Zitat antworten Zitat