Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Variablen aus externer Datei

Empfohlene Antworten

Veröffentlicht

Hallo zusammen,

ich habe folgende Problemstellung:

Ich muß ein Programm schreiben, das

Werte aus einer ASCII-Datei einliest,

diese als Variablen aufnimmt,

mit den Variablen eine Berechnung

der Form r=a1*x^2+a2*x+a3+b1*y^2+b2*y+b3

(a1, a2, a3, b1, b2, b3, x, y aus der Datei)

vornimmt

und das Ergebnis(hier r) in eine zweite ASCII-Datei ausgibt.

Mir macht insbesondere der Datenim- und export und die Deklaration der

Variablen Sorgen. Hat jemand einen Tipp, wie ich das Problem

lösen kann?

Dank im voraus

DocBrown

Hi DocBrown,

die Schwierigkeit liegt hier darin, dass eine Berechnung mit Werten gemacht werden muss, die als ASCII vorliegen. Also muessen die verschiedenen Substrings herausgeparst und in Zahlentypen (int, float, usw.) umgewandelt werden. Dies geht am besten, indem man die gesamte Formel erstmal als String bzw. char[] in den Arbeitsspeicher liest. Die noetigen Umwandlungsfunktionen (atoi(), atof()) findest Du in der stdlib.h.

Wird ne huebsche Hampelei und ist ganz lehrreich. ;)

Uli

Hi EisenUli!

Erstmal lieben Dank für Deine Antwort.

Wenn ich Dich richtig verstanden habe, gehst Du davon aus, daß sich dies gesamte Formel in der Datei befindet.

Ich brauche die ASCII-Datei nur für die einzeln Variablen.

Die Formel selbst kann ich im Programm selbst definieren.

Mein größtes Problem ist das "Heraus-Parsen" der Zahlen aus der ASCII-Datei und Definieren dieser Zahlen als Variablen im Programm, bzw. das Zurück-Parsen einer anderen Variablen(des Ergebnisses der Berechnung) in eine andere ASCII-Datei.

Soweit durch Nachlesen herausgefunden habe, wird das über die Funktionen fopen, fread, etc. aus stdio.h realisiert. Ich steige nur leider nicht durch den genauen Funktionsaufruf durch.

DocBrown

Nun gut, wenn die Variablen in ASCII-Form einzeln in Dateien stehen wird die Sache etwas einfacher. Dann also erstmal als String auslesen und dann munter drauf los. Files behandelst Du mit symbolischen Pointern, die man mit fopen() auf die jeweilige Datei setzt. Hat man dies, gibt es einen ganzen Zoo von Funktionen fuer Lesen oder Schreiben, Pointersetzen usw. Das alles zu erklaeren wuerde hier zu weit fuehren. Du wirst nicht umhinkommen, erstmal ein entsprechendes Tutorial zu dem Thema oder ein Buch zu studieren. Am Beispiel wird dann schnell klar, wie es geht.

Uli

int variable:=0

unsigned char t:=0

int i:=0

solange string!=0

t:=string

t:=t-'0'

t > 9

nein | ja

variable:=variable*10+t | break

i++

ps: soll ein struktogramm sein !!!

#include <stdio.h>

#include <iostream.h>

int lese_zahl(unsigned char *,int*); //liesst die zahlen aus der datei

void speicher(FILE *,char *,int); //speichert die ergebnisse in die datei

void main()

{

unsigned char puffer[256];

int zaehler=0;

int laenge;

FILE *fp;

int a1, a2, a3, b1, b2, b3, x, y;

fp=fopen("ein.txt","r"); //datei öffnen

laenge=fread(puffer,1,256,fp); //und in den puffer laden

fclose(fp); //datei schließen

a1=lese_zahl(puffer,&zaehler); //lese a1 usw.

a2=lese_zahl(puffer,&zaehler);

a3=lese_zahl(puffer,&zaehler);

b1=lese_zahl(puffer,&zaehler);

b2=lese_zahl(puffer,&zaehler);

b3=lese_zahl(puffer,&zaehler);

x=lese_zahl(puffer,&zaehler);

y=lese_zahl(puffer,&zaehler);

/* hier kommt deine berechnung rein*/

fp=fopen("aus.txt","w"); //erstelle eine datei aus.txt

speicher(fp,"a1",a1); //speicher "a1=..." usw.

speicher(fp,"a2",a2);

speicher(fp,"a3",a3);

speicher(fp,"b1",b1);

speicher(fp,"b2",b2);

speicher(fp,"b3",b3);

speicher(fp,"x",x);

speicher(fp,"y",y);

fclose(fp);

}

// diese funktion wandelt ascII- zahlen in int um

// übergabe von puffer und zähler als adresse

int lese_zahl(unsigned char *p,int* i)

{

int variable=0,v,x;

x = *i; //adresseninhalt nach x (zaehler)

for (;p[x]!='=';x++) {} //bis zum nächsten '=' gehen

x++; //zum zeichen nach '='

for (;p[x]<='9' && p[x]>='0';x++) //solange pufferzeichen >'0'-zeichen und <'9'-zeichen im ASCII

{

v=p[x]-'0'; //mache zeichen zur ziffer

variable=variable*10+v; //dualzahl * 10 + ziffer

}

*i = x; //aktuelle pufferpos merken

return variable; //rüchgabe der neuen variablen

}

//speichert text und zahl in eine datei

//übergabe von dateihandle, adresse des textanfangs und die zahl

void speicher(FILE *hwd,char *text,int zahl)

{

char stringzahl[20]; //maximale länge von 19 ziffern

int i=18; //letzte ziffer an pos 18

stringzahl[19]=0; //pos nach letzter ziffer muß 0 sein (stringabschluß)

for (;zahl>0;i--) //solange zahl >0

{

stringzahl=zahl%10+'0'; //ziffer zu zeichen und in den string

zahl=zahl/10; //zahl /10 (rest verschwindet bei int)

}

i++; //durch schleife eine pos zu weit vorn

fprintf(hwd,"%s=%s\n",text,stringzahl+i);

//speichern von text und zahlenstring

}

  

So jetzt noch mit float.

#include <stdio.h>

#include <iostream.h>

#include <math.h>

float lese_zahl(unsigned char *,int*); //liesst die zahlen aus der datei

void main()

{

unsigned char puffer[256];

int zaehler=0;

int laenge;

FILE *fp;

float a1, a2, a3, b1, b2, b3, x, y;

fp=fopen("ein.txt","r"); //datei öffnen

laenge=fread(puffer,1,256,fp); //und in den puffer laden

fclose(fp); //datei schließen

a1=lese_zahl(puffer,&zaehler); //lese a1 usw.

a2=lese_zahl(puffer,&zaehler);

a3=lese_zahl(puffer,&zaehler);

b1=lese_zahl(puffer,&zaehler);

b2=lese_zahl(puffer,&zaehler);

b3=lese_zahl(puffer,&zaehler);

x=lese_zahl(puffer,&zaehler);

y=lese_zahl(puffer,&zaehler);

/* hier kommt deine berechnung rein*/

fp=fopen("aus.txt","w"); //erstelle eine datei aus.txt

fprintf(fp,"a1=%f\n",a1); //ausgabe der floatzahlen

fprintf(fp,"a1=%f\n",a2);

fprintf(fp,"a1=%f\n",a3);

fprintf(fp,"a1=%f\n",b1);

fprintf(fp,"a1=%f\n",b2);

fprintf(fp,"a1=%f\n",b3);

fprintf(fp,"a1=%f\n",x);

fprintf(fp,"a1=%f\n",y);

fclose(fp);

}

// diese funktion wandelt ascII- zahlen in int um

// übergabe von puffer und zähler als adresse

float lese_zahl(unsigned char *p,int* i)

{

float variable=0;

int v,x,k;

x = *i; //adresseninhalt nach x (zaehler)

for (;p[x]!='=';x++) {} //bis zum nächsten '=' gehen

x++; //zum zeichen nach '='

for (;p[x]<='9' && p[x]>='0';x++) //solange pufferzeichen >'0'-zeichen und <'9'-zeichen im ASCII

{

v=p[x]-'0'; //mache zeichen zur ziffer

variable=variable*10+v; //dualzahl * 10 + ziffer

}

if (p[x]=='.' ||p[x]==',') //wenn punkt oder komma dann

{

x++; //zum nächsten zeichen

for (k=1;p[x]<='9' && p[x]>='0';x++)//solange pufferzeichen >'0'-zeichen und <'9'-zeichen im ASCII

{

v=p[x]-'0'; //mache zeichen zur ziffer

variable = variable+v/pow(10,k);//floatzahl + ziffer / 10 hoch k

k++; //exponent+1

}

}

*i = x; //aktuelle pufferpos merken

return variable; //rüchgabe der neuen variablen

}

:D

jau toosten, was dagegen, wenn du meine sachen auch mal programmierst ... :D:D:D ?!

ich hab da noch son nervendes ekliges riesen tcl programm das nie das tut was man ihm sagt ... *ggg*

:D Kommt drauf an ;)

warum so umständlich. wenn ich das richtig verstanden habe stehen die wertte in einer datei und zwar schon der reihe nach.

Beispiel:

// datei: ein.txt

1 2 3 4 5 6 7 8 9 0

und diese werte sollen der reihe nach in verschiedene variablen gespeichert werden.

wenn dem so ist würde ich folgendes programm nehmen.

#include <stdio.h>

int main()

{

FILE* datei;

int a1,a2,a3,a4,a5;

datei = fopen ("ein.txt", "r");

fscanf (datei, "%d %d %d %d %d", &a1, &a2, &a3, &a4, &a5);

fclose (datei);

/* Berechnungen durchführen */

datei = fopen ("zwei.txt", "w");

fprintf (datei, "ergebnis == %d", ergebnis_der_berechnung);

fclose (datei);

}

ist meiner meinung nach etwas einfacher wie das beispiel von toosten...

Und was machst du bei einem tippfehler (ein leerzeichen mehr) ?

Mein prog reagiert nur auf '=' und nimmt die zahl dahinter solange zahlen kommen und dann sucht es das nächste '=' usw. .

gegenfrage: was ist schwerer ? zahlen in einer reihe zu schreiben und zwischen jeder ein leerzeichen lassen oder eine = und dahinter eine zahl zu schreiben. ich denke das man bei beiden arten keine größeren probleme haben sollte.

Schon mal was von anwederfreundlich gehört ? :eek:

schon mal was von wartungsfreundlichem code gehört. aber soll ja jetzt auch egal sein. jeder auf seinem weg.

Schön zu sehen, daß es außer mir noch ein paar andere Anwendungsentwickler gibt, die einmal wirklich selber eine Anwendung entwickeln können.

JUNGS->Wir müssen den Namen der Fachinformatiker in Ehre halten - sonst werden wir noch mit den anderen Luschen, die nur zum Popeln in den Unterricht gekommen sind, verglichen.

Nicht vergessen, der Ruf aller Fachinformatiker fällt nachher auch auf uns zurück!

  • 3 Wochen später...
Original erstellt von Crush1:

<STRONG>...JUNGS->Wir müssen den Namen der Fachinformatiker in Ehre halten - sonst werden wir noch mit den anderen Luschen, die nur zum Popeln in den Unterricht gekommen sind, verglichen.

Nicht vergessen, der Ruf aller Fachinformatiker fällt nachher auch auf uns zurück!...</STRONG>

Original erstellt von Defender:

<STRONG>

[/QB]

...arggh, sorry... :mad:

...also ich hoffe mal nicht dass mein Ruf auf euch zurück fällt... :D

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.