Forum: C-Programmieren
Moderatoren: juergen, Martin ConradThema: [EDIT] - String aus asc.file einlesen an Funktion übergeben wieder einlesen
[EDIT] - String aus asc.file einlesen an Funktion übergeben wieder einlesen
Pateriol2005 am 18.01.2012 um 00:30
ich habe mal wieder ein Problem bei einer Übungsaufgabe im Bereich Strings.
Wir sollen eine ".asc" file (vorher .txt-file) zeilenweise einlesen. In dieser Datei stehen Werte für Polarkoordinaten, die in kartesische Koordinaten umgewandelt werden sollen. Die Funktion dafür ist kein Problem. Auch das zeilenweise einlesen habe ich geschafft.
Die Unklarheit besteht darin wie ich aus folgender Stringzeile
Zitat:
% Angles measured from x over y i.e. right=0 and up=90 degrees.
% ang [deg] rad [m] x (right) [m] y
-180.000000000000000 0.100000000000000 0.000000000000000 0.00...
-175.000000000000000 0.793147180559945 0.000000000000000 0.00...
die einzelnen Werte in eine Variable schreiben kann, die ich aus der Mainfunktion an eine Transformationsfunktion übergeben kann und danach wieder in eine neue asc.Datei einlesen kann. Ist mir ein Rätsel das Ganze.
Mein bisheriger Code lässt mich nur auf die Inputdatei zugreifen:
#include <stdio.h>
#define LAENGE 255 //länge der einzelnen Zeilen
#define ANZAHL 11 //Anzahl der Zeilen die eingelesen und in eine neue
//Datei geschrieben werden sollen (mit den neuen Werten)
double kat(double *ang, double *rad); // Forward Deklaration
double kat (double *ang, double *rad){ // Umwandlung Polarkoordinaten
// in kartesische Koordinaten
double *x, *y;
*x = *rad * cos(*ang);
*y = *rad * sin(*ang);
return *x, *y; // Rückgabewerte in eine neue Datei schreiben
}
int main (void)
{
char t, u;
char *nach = malloc(255);
double ang, rad;
FILE *datei, *katei;
char line[ANZAHL][LAENGE];
int i ;
datei = fopen ("ex10Polar_pol.asc", "rt");
katei = fopen("ex10Polar_new.asc", "wt");
if (datei != NULL)
{
for(i = 0; i < ANZAHL; i++)
{
fgets(line[i],LAENGE,datei); //zeilen weise lesen mit fgets
printf ("%i) %s\n",i ,line[i]);
}
while(fgets(line, LAENGE, katei))
{
fputs(line, katei);
puts(line);
if(++i < 10)
sscanf(katei, "%lf %lf %*f %*f\n", &ang, &rad);
printf("%f %f\n", ang, rad);
}
fclose (datei);
return 0; // Exit from while-loop
}
}
Wie kann ich solche Tabellenwerte also umwandeln: -180.000000000000000 in meinem Beispiel in einer Funktion und wieder in eine neue Datei hineinschreiben?
Der Befehl "fgets" liest ja die ganze Zeile ein, die in 4 Spalten aufgeteilt ist (in der Textfile durch ein Whitespacezeichen getrennt). Ich müsste dem Compiler sagen, dass er nur bis zum Whitespacezeichen liest und den Wert in die Funktion "kat" übergibt. Ich habe nur keine Ahnung wie das gehen soll.
Irgendjemand eine Ahnung?? Vielen Dank!
Re: String aus asc.file einlesen an Funktion übergeben wieder einlesen
bcc-fan am 19.01.2012 um 10:23
Bekommst du da keine Fehler oder Warnungen?
MfG bcc-fan
--
C/C++
only just for fun
Re: String aus asc.file einlesen an Funktion übergeben wieder einlesen
Pateriol2005 am 20.01.2012 um 22:56
oh doch da kommen schon ein paar Warnings. Zumindest aber spuckt der Compiler mir
die geöffnete Datei aus (bin da schon stolz drauf). Das Problem ist aber dass ich
keine Ahnung habe wie ich weiter tun soll. Pointer auf die Zeile bis zum Whitespace und dann in eine Funktion schicken und wieder in eine neue Datei schicken? Keine
Ahnung wie ich verfahren soll. Und zudem kommt der ganze Stress an der TU kurz vor Semesterende. Kannst du mir einen Tipp geben? Wäre dir sehr sehr dankbar.
[EDIT] - Re: String aus asc.file einlesen an Funktion übergeben wieder einlesen
bcc-fan am 21.01.2012 um 10:29
Meine Testcompiler bauen aus dem gezeigten Quelltext keine ausführbare Datei.
Vermute du nutzt einen Microsoft Compiler?
Und die Warnungen solltest du angehen. Seltsam - in deinem Quelltext hast du mal die Zeile richtig und dann falsch ( -> Warnung ).
Stress? Dafür lässt du dir aber ganz schön Zeit
Wo nutzt du deine Funktion kat?
Da denke ich das die eh nicht so funktioniert wie du dir das erhoffst. Wie war das noch mal mit den Rückgabewerten in C bei einer Funktion?
Ich bin nicht drin in der Materie mit den Koordinaten und wie die in deiner Ausgangsdatei drin stehen. 4 Spalten? stehen in den hinteren Spalten nur Nullen? Was könnte in der ersten Spalte stehen? Abgesehen von + oder -, wie gross sind die Zahlen? Was verbindest du mit Zahlen aus dem Wertebereich im Zusammenhang mit der Aufgabe? Dann zur 2. Spalte das Gleiche.
Welche Daten benötigst du zum rechnen? Wie übergibst du die Zahlen aus der "main" zur "kat"? Sollt ihr die berechneten Daten zur "main" zurück liefern? Oder kann "kat" die Daten schon in die Datei schreiben? Beides ist möglich.
Welches der richtige Lösungsansatz ist solltest du aufgrund deiner Vorkenntnisse und der exakten Aufgabenstellung besser einschätzen können.
Jetzt zeig mal ein wenig Einsatz.
MfG bcc-fan
--
C/C++
only just for fun
[EDIT] - Re: String aus asc.file einlesen an Funktion übergeben wieder einlesen
Pateriol2005 am 22.01.2012 um 21:13
jo also habe etwas an dem Code verbessert. Es gibt jetzt keine Warnings mehr.
Ausgegeben werden jetzt 10 Zeilen und 2 Spalten mit den jeweiligen Werten.
Jetzt muss ich diese Werte nur noch umwandeln in kartesische Koordinaten. Die genaue
Umrechnung ist ja irrelevant für das Prinzip. Es geht also nur noch darum diese Werte aus der asc.File in eine Funktion zu übergeben und die neuen Werte in eine neue File zurückzuschreiben.
Hier z.B. so eine Zeile:
Zitat:
Winkel: Radius:
-150.000000 2.04591000
Diese 11-stelligen Werte möchte ich an die Funktion kat übergeben.
Hier jetzt mein "neuer" besserer Code:
#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;
FILE *f, *o;
unsigned i=0;
char *line;
char s[len];
double ang, rad;
f = fopen("ex10Polar_pol.asc", "rt");
if (f==NULL) {
printf("Eingabedatei geht nicht.\n");
exit(1);
}
o = fopen("ex10Polar_new.asc", "wt");
if (f==NULL) {
printf("Ausgabedatei geht nicht.\n");
exit(2);
}
while (line = fgets(s, len, f)) {
if(++i < 10) {
continue; // Skip to next iteration of while-loop
}
sscanf(s, "%lf %lf %*f %*f\n", &ang, &rad); // The "*" in %*f skips this input
printf("%f %f\n", ang, rad);
}
fclose(f);
fclose(o);
return 0;
}
Ich werde jetzt einfach versuchen über eine Stringfunktion bis zum Whitespace einen Pointer zu erstellen und dann...
Könntest du mir noch einen Tipp geben, welche Funktion man da am Besten nimmt?
Danke dir!
beste Grüße
Pateriol
