2-spaltige Textdatei lesen und auswerten

Hallo liebes Forum :smile:

Ich hoffe ich kann hier mein Problem gut verdeutlichen.
zunächst muss ich sagen, dass ich sehr wenig erfahrung mit Programmierung habe. vom studium her sollen wir nun in C (also nicht C++, ist C# was anderes?) eine Simulation programmieren. hat soweit alles geklappt, mit mühe aber ging. zur Fertigstellung meines projekts brauche ich aber noch einen letzten Schritt.

Ich bekomme eine Textdatei ausgegeben. Der Inhalt ist so, dass in jeder Zeile 2 Zahlen stehen. Genauer gesagt sind das 2 Floats. Ich bekomme immer 2 Zahlen mit jeweils 6 Nachkommastellen. Also so:

0.000000 0.000000
0.010000 0.000100
0.020000 0.000300
0.030000 0.000600
0.040000 0.001000
0.050000 0.001500
0.060000 0.002100
0.070000 0.002800
0.080000 0.003600
0.090000 0.004500
0.100000 0.005500
0.110000 0.006600
0.120000 0.007800
0.130000 0.009100
0.140000 0.010500
0.150000 0.012000
0.160000 0.013600
[…]
4.350005 9.482996
4.360005 9.526596
4.370005 9.570296
4.380005 9.614097
4.390006 9.657997
4.400006 9.701997
4.410006 9.746097
4.420006 9.790297
4.430007 9.834597
4.440007 9.878997
4.450007 9.923497
4.460007 9.968098
4.470007 10.012797
4.480008 10.057597
4.490008 10.102497
4.500008 10.147497
4.510008 10.192597
4.520009 10.237798

und immer so weiter bis zur Zeile x. Die Anzahl der Zeilen ist veränderlich, je nachdem wie lange die simulation läuft.
Es handelt sich hierbei und x und y-werte! also links der x-wert und rechts der y-wert! So nenne ich das jetzt immer!

Ich hoffe bis hierhin ist alles klar?

Jetzt kommt mein eigentliches Problem:
Es kommt in bestimmten bereichen vor, dass der y-wert der nachfolgenden Zeile identisch ist. Später dann wieder weiterzählt. x-wert zählt ganz stur durch! Siehe hier:

[…]
25.940498 275.705505
25.950499 275.885010
25.960499 276.064606
25.970499 276.244324
25.980499 276.424133
25.990499 276.604034
26.000500 276.784027
26.010500 276.964142
26.020500 277.144348
26.030500 277.324646
26.040501 277.505035
26.050501 277.685547
26.060501 277.866150
26.070501 278.046844
26.080502 278.046844
26.090502 278.046844
26.100502 278.046844
26.110502 278.046844
26.120502 278.046844
26.130503 278.046844
26.140503 278.046844
26.150503 278.046844
26.160503 278.046844
26.170504 278.046844
26.180504 278.046844
26.190504 278.046844
[…]
27.790541 278.046844
27.800541 278.046844
27.810541 278.046844
27.820541 278.046844
27.830542 278.046844
27.840542 278.046844
27.850542 278.046844
27.860542 278.046844
27.870543 278.046844
26.060501 278.046844
26.070501 278.227448
26.080502 278.407959
26.090502 278.588348
26.100502 278.768646
26.110502 278.948853
26.120502 279.128967
26.130503 279.308960
26.140503 279.488861
26.150503 279.668671

JETZT KOMMTS:
Ich muss die Zeilen, in denen der y-wert identisch ist, löschen (abgesehen von der ersten!). Also das Programm soll praktisch jede Zeile des Textes durchgehen und dann wenn es merkt „OH! der y-wert ist ja gleich dem von der vorherigen Zeile!“ diese Zeile einfach löschen bzw. nicht in eine neu erzeugte Datei schreiben. Alles andere schon!

Ich habe leider keine Ahnung wie das gehen soll :frowning: Kann mir da jemand helfen?
Viele Dank schonmal an den/die, die meinen langen Text gelesen hat/haben!

Viele Grüße
Andre

Howdy,

also zunaechst einmal kommt ein Ansatz wie folgt in Frage:

double x, y; 
double last = -1.0;

while (readXY(x,y))
{
 if (!equal(y,last))
 {
 action(x,y);
 last = y;
 }
}

readXY(double& x, double& y)
liest dabei die Daten von deiner Datei und gibt true zurueck, wenn ein Datenpaar gelesen werden konnte, ansonsten false.

bool equal(double a,double b)
gibt true zurueck, wenn a und b gleich sein sollen, und ansonsten false.

Gruss
norsemanna

Hi,

was willst du denn mit den Werten machen? Willst du sie auswerten und irgend was sehen, oder musst du sie weiterverarbeiten?

Für den ersten Fall installiere einfach mal Octave. Dort läuft es dann auf ein einfaches ‚werte = load(„dateiname“);‘ hinaus. Ist aber wieder was, in das du dich erst mal einarbeiten muss.

Grüße

Howdy Mimon,

was willst du denn mit den Werten machen? Willst du sie
auswerten und irgend was sehen, oder musst du sie
weiterverarbeiten?

die Frage ist doch eher, was soll deine Antwort? Wir sind hier im C/C++ Forum. Da hilft wohl kaum eine Antwort, die sagt, benutz eine andere „Sprache“ und ansonsten keine Hilfe anbietet … Lies bitte den Abschnitt in den FAQ über „Off Topic“ Antworten.

Gruss
norsemanna

ah, damit versuch ich das mal…

also hier ist mein quelltext bis lang:

// Programmstruktur:
// 1) Lese Datei ein
// 2) schaue in jede Zeile und speicher x- und -Wert
// 3) schreibe in andere Datei, wenn die y-Werte aufeinanderfolgender Zeilen unterschiedlich sind
// 4) sind sie gleich, speicher sie nicht
// 5) Fertig?

#include

main()
{
// Lese Datei ein:
FILE* werte;
werte=fopen(„werte“,„r“);

// schaue in jede Zeile und speicher x- und -Wert

// Datei wieder schliessen
fclose(werte);
}

ich versuch mal das da zu integrieren! vll kannst du mir nochmal dabei helfen :smile:

Howdy,

füg zunächst einmal den von mir gegebenen Code in main ein (und zwar mit einer { vorweg und einer } hinterdrann).

main()
{
 FILE\* werte;
 werte=fopen("werte","r");
 
 {
 double x, y; 
 double last = -1.0;

 while (readXY(x,y)) 
 {
 if (!equal(y,last))
 {
 action(x,y);
 last = y;
 }
 }
 }

 fclose(werte);
}

Dann wirst du feststellen, dass du in readXY zusätzlich den „werte“ Pointer benötigst, also ist die Signatur von readXY dann anzupassen:

bool readXY(FILE\* werte, double& x, double& y)
{
// hier x und y von werte lesen
// und true zurueck geben, wenn das funktioniert hat
// ansonsten false zurueck geben
}

Da das Ganze auch noch in eine Ausgabedatei geschrieben werden soll,
musst du natürlich vorher einen weiteren FILE* output vereinbaren und zum schreiben öffnen. Da dann die „action“ etwas in die Datei schreiben soll, braucht auch diese Funktion einen weiteren Parameter:

void action(FILE\* output, double x, double y)
{
// hier werte x und y in Ausgabedatei output schreiben
}

Dort wo readXY und action aufgerufen wird, musst du natürlich auch den jeweiligen Parameter als erstes übergeben (d.h. readXY(werte,x,y) und action(output,x,y).

Gruss
norsemanna

Hi,

Stichwort Tunnelblick und so.

Warum alles auf Teufel komm raus in C machen, wenns es für manche Problemstellungen einfach bessere Möglichkeiten gibt?

Primär gehts mir einfach darum, dem Threadersteller zu helfen. Wenn du dann gleich Flamewar starten willst, melde dich bitte beim Heiseforum an.

Hallo

Stichwort Tunnelblick und so.

Warum alles auf Teufel komm raus in C machen, wenns es für
manche Problemstellungen einfach bessere Möglichkeiten gibt?

Primär gehts mir einfach darum, dem Threadersteller zu helfen.

Dann lies noch mal nach. Er schrob:

… vom studium her sollen wir nun in C …

Grüße

CMБ

ohje… ich versteh die logik des programms aber ich weiss echt nicht wie ich das einbinden soll :frowning: ich fühl mich so ein bischen aufgeschmissen…

könntest du vll den code komplett ausschreiben und mir dann die schritte erklären? Ich glaub das lern ich am meisten! wir bekommen als ingenieure leider kein wissen über programmierung bzw. die syntax oder andere :-/

Wäre echt super nett von dir!