http://www.pronix.de -> Forum -> C-Programmieren

Unterseiten

Forum: C-Programmieren

Moderatoren: juergen, Martin Conrad

Thema: [EDIT] - String aus asc.file einlesen an Funktion übergeben wieder einlesen

  • (nur registrierte Mitglieder)
Okay es war echt zach die Programmierung aber jetzt hab ich die Lösung:



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
  const char HEADER_TAG_LINECOUNT[] = "% No. of points:";
  const char COMMENT_SYMBOL[] = "%";
  const unsigned len = 255;
  char *line;
  char buffer[len];
  double ang, rad;

  char tempstring[len];
  int header_tag_found = 0;
  int no_points = 0;

  FILE *f = fopen("ex10Polar_pol1114255.asc", "rt");
  if (f==NULL) {
    printf("Eingabedatei geht nicht.\n");
    exit(1);
  }

  FILE *o = fopen("ex10Polar_new1114255.asc", "wt");
  if (f==NULL) {
    printf("Ausgabedatei geht nicht.\n");
    exit(2);
  }

  // Zeilenweise aus f nach buffer lesen
  while (line = fgets(buffer, len, f))
  {
    // Suche nach dem ersten Zeichen in buffer und schreibe es nach tempstring
    sscanf(buffer, "%s", tempstring);
    if (!strcmp(tempstring, COMMENT_SYMBOL))
    {
      // Zeile mit % gefunden -> schreibe die ganze Zeile in Outputdatei
      fputs(buffer, o);

      // Anzahl der zu verarbeitenden Datenzeilen eruieren, sofern noch nicht geschehen
      // d.h. header_tag_found -> false ist
      if (!header_tag_found)
      {
        // Lese 16 Zeichen nach tempstring und den folgenden Integer nach no_points
        sscanf(buffer, "%16[^\n] %d", tempstring, &no_points);
        // Vergleiche tempstring mit dem header tag um zu überprüfen ob die eingelesenen
        // 16 Zeichen tatsächlich dem header tag entsprechen
        if (strncmp(tempstring, HEADER_TAG_LINECOUNT, 16) == 0)
          header_tag_found = 1;
      }
    }
    // Paare können nur dann verarbeitet werden wenn bekannt ist,
    // wieviele überhaupt verarbeitet werden sollen d.h. header_tag_found -> true
    else if (header_tag_found && no_points > 0)
    {
      no_points--;
      sscanf(buffer, "%lf %lf %*f %*f\n", &ang, &rad); // The "*" in %*f skips this input

      double x = rad * cos(ang);
      double y = rad * sin(ang);

      // Outputzeile bilden und nach tempstring schreiben
      sprintf(tempstring, "%20.15lf %20.15lf %20.15lf %20.15lf\n", ang, rad, x, y);

      // Die neu gebildete Zeile wird nun nach o geschrieben
      fputs(tempstring, o);
    }
  }

  fclose(f);
  fclose(o);

  return 0;
}

 
Sollte ihr also das Umrechnen der Koordinaten doch nicht in eine Umrechnungsfunktion auslagern?

--
C/C++
only just for fun

 
Das war eigentlich auch zuerst mein Ziel aber das mit den Pointern und
war mir dann doch zu kompliziert.
 
  • (nur registrierte Mitglieder)