 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Marc Gerritzen Guest
|
Posted: Mon May 17, 2004 11:21 pm Post subject: letzten Zeilen einer Datei auslesen |
|
|
Hallo,
ich habe mir folgende Funktion zum auslesen der letzten 745 Zeilen einer Datei mit vorgebener Anzahl der Gesamtzeilen(durch 2. Funktion) gebastelt:
int GetData(string strPath,int DataLength)
{
//Datei oeffnen
ifstream indat(strPath.c_str());
unsigned int zeilen=0;
string Daten[745];
string inp;
if(indat)
{
while(!indat.eof())
{
getline(indat,inp);
//Bereich in dem sich die Zahlen befinden, welche Daten[] übergeben werden sollen
if(zeilen>=DataLength-745 && zeilen<=DataLength)
{
//in Daten schreiben
Daten[zeilen]=inp;
cout <<"DATEN: " << Daten[zeilen] << "n" << endl;
zeilen++;
}
else
{
zeilen++;
}
cout <
}
//Datei wieder freigeben
indat.close();
}
else
{
cout <<"Fehler beim öffnen der Datei " << strPath << endl;
}
}
Funktion2:
int GetDataLength(string strPath)
{
ifstream indat(strPath.c_str());
int DataLength;
string buf;
getline(indat,buf);
DataLength++;
while(!indat.eof())
{
getline(indat,buf);
DataLength++;
}
indat.close();
return DataLength;
}
Aufrufen tue ich die Funktionen so:
string strPath="test";
GetData(strPath,GetDataLength(strPath));
nun bekomme ich jedoch nur Zahlen ausgegeben (die Ausgabe der Zeilen in der While-Schleife) jedoch nie "DATEN:***". Ich komme einfach nicht hinter meinen Denkfehler.
Vielleicht hättet ihr ja einen Tip :)
achja:
Die Datei die ausgelesen werden soll enthält ~10000 Zeilen Daten in diesem Format.
03.02.2004 21:00:00 0 0 0
03.02.2004 22:00:00 0 0 0
03.02.2004 23:00:00 0 0 0
04.02.2004 00:00:00 0 0 0
04.02.2004 01:00:00 0 0 0
vielen Dank schonmal
Marc Gerritzen
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Torsten Schneider Guest
|
Posted: Tue May 18, 2004 9:18 am Post subject: Re: letzten Zeilen einer Datei auslesen |
|
|
Marc Gerritzen <Marc.Gerritzen (AT) t-online (DOT) de> wrote:
| Quote: | ich habe mir folgende Funktion zum auslesen der letzten 745 Zeilen
einer Datei mit vorgebener Anzahl der Gesamtzeilen(durch 2. Funktion)
gebastelt:
[...]
string Daten[745];
string inp;
if(indat)
{
while(!indat.eof())
{
getline(indat,inp);
//Bereich in dem sich die Zahlen befinden, welche Daten[] übergeben werden sollen
if(zeilen>=DataLength-745 && zeilen<=DataLength)
{
//in Daten schreiben
Daten[zeilen]=inp;
|
Mal ein längeres Quote, aber das wird dir in die Hose gehen. Das Array
beginnt bei dem Index 0, du nimmst aber einen Index, der der
Zeilennummer entspricht.
Es sollte noch eine Variable geben, die bei der Zuweisung, beginnend von
0, hochgezählt wird. Alternativ kannst du den Index so umrechnen, dass
die erste Zeile wirklich nach Daten[0] geschrieben wird.
Du schreibst mit dem Code wahllos in beliebige Speicherbereiche.
Grüße, Torsten
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Tue May 18, 2004 10:01 am Post subject: Re: letzten Zeilen einer Datei auslesen |
|
|
Marc Gerritzen wrote:
| Quote: |
Hallo,
ich habe mir folgende Funktion zum auslesen der letzten 745 Zeilen einer Datei mit vorgebener Anzahl der Gesamtzeilen(durch 2. Funktion) gebastelt:
int GetData(string strPath,int DataLength)
{
//Datei oeffnen
ifstream indat(strPath.c_str());
unsigned int zeilen=0;
string Daten[745];
string inp;
if(indat)
{
while(!indat.eof())
{
getline(indat,inp);
//Bereich in dem sich die Zahlen befinden, welche Daten[] übergeben werden sollen
if(zeilen>=DataLength-745 && zeilen<=DataLength)
{
//in Daten schreiben
Daten[zeilen]=inp;
|
Bist Du Dir da ganz sicher :-)
angenommen Deine Datei hat 1000 Zeilen, die Du auch korrekt
an diese Funktion uebergibst. Dann zaehlt doch die Variable
zeilen in dieser Schleife von 0 bis 1000 (zeilen++ wird sowohl
im then als auch im else Zweig gemacht). Und dann greifst
Du zb. auf Daten[995] zu.
Frage: Warum speicherst Du das Ganze ueberhaupt in einem Array
zwischen. Wenn Du nur eine Ausgabe willst brauchst Du das
doch gar nicht.
Zweite Anmerkung:
Eine Schleife in der Form
while( !file.eof() ) {
}
ist praktisch immer falsch. In C++ wird eof erst dann true
wenn Du versuchst *hinter* das tatsaechliche Dateiende
zu lesen, also nicht wie in anderen Sprachen nachdem die
letzten gueltigen Daten gelesen wurden.
In C++ verwendet man foglendes Idiom:
wiederhole( solange Daten gelesen werden koennen )
mach was mit den Daten
// Schleife ist zuende, aber warum?
if( !eof )
Irgendein Fehler ist aufgetreten.
Zur Unterstuetzung dieses Idioms liefert Dir jede Lesefunktion
einen Returnwert, der direkt fuer so eine Abfrage benutzt werden
kann:
while( getline( indat, inp ) ) {
// do something with indata
}
if( !indat.eof() )
cout << "Errorn";
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Marc Gerritzen Guest
|
Posted: Tue May 18, 2004 2:52 pm Post subject: Re: letzten Zeilen einer Datei auslesen |
|
|
Hallo,
wie kann ich nicht in wahlose Speicherbereiche schreiben? Kann ich nicht einfach einen Array mit der Größe [745] machen und dann von [0] bis [745] reinschreiben?
Steh da gerade irgendwie auf dem Schlauch.
gruß
Marc Gerritzen
On Tue, 18 May 2004 09:18:23 +0000 (UTC)
[email]schneider (AT) mabi (DOT) de[/email] (Torsten Schneider) wrote:
| Quote: | Es sollte noch eine Variable geben, die bei der Zuweisung, beginnend von
0, hochgezählt wird. Alternativ kannst du den Index so umrechnen, dass
die erste Zeile wirklich nach Daten[0] geschrieben wird.
|
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Marc Gerritzen Guest
|
Posted: Tue May 18, 2004 2:56 pm Post subject: Re: letzten Zeilen einer Datei auslesen |
|
|
ich schreibe in einen Array um später das ganze zeilenweise zu Parsen.
On Tue, 18 May 2004 12:01:31 +0200
Karl Heinz Buchegger <kbuchegg (AT) gascad (DOT) at> wrote:
| Quote: | Frage: Warum speicherst Du das Ganze ueberhaupt in einem Array
zwischen. Wenn Du nur eine Ausgabe willst brauchst Du das
doch gar nicht.
Habe zu dem Problem nun folgende Lösung gefunden: |
void GetData(string strPath)
{
ifstream file(strPath.c_str());
string datebuf,timebuf;
int ACbuf,DCbuf,WHbuf;
int linie=0;
string line;
while(getline(file,line))
{
stringstream stream(line);
if(!(stream >> datebuf >> timebuf >> ACbuf >> DCbuf >> WHbuf))
{
data.AC[linie]=0;
data.DC[linie]=0;
data.WH[linie]=0;
data.Date[linie]=datebuf;
data.Time[linie]=timebuf;
cout <<"Zeile:"<
linie++;
continue;
}
data.AC[linie]=ACbuf;
data.DC[linie]=DCbuf;
data.WH[linie]=WHbuf;
data.Date[linie]=datebuf;
data.Time[linie]=timebuf;
linie++;
}
}
meint ihr das ist sinnvoll um eine Datei mit diesem Format zu parsen:
03.02.2004 17:00:00 31 49 17
03.02.2004 18:00:00 0 0 1
04.02.2004 02:00:00 <-- kann auch vorkommen deshalb müssen hier nullen hinzugefügt werden.
gruß
Marc Gerritzen
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Torsten Schneider Guest
|
Posted: Tue May 18, 2004 3:00 pm Post subject: Re: letzten Zeilen einer Datei auslesen |
|
|
Marc Gerritzen <Marc.Gerritzen (AT) t-online (DOT) de> wrote:
| Quote: | wie kann ich nicht in wahlose Speicherbereiche schreiben? Kann ich
nicht einfach einen Array mit der Größe [745] machen und dann von [0]
bis [745] reinschreiben?
|
Nein, nur von 0 bis 744.
Du versuchst aber, beispielsweise bei einer 2000 Zeilen langen Datei in
[1999] zu schreiben, und das geht in die Hose.
In C++ und auch in C ist es problemlos möglich, über Arraygrenzen hinweg
zu schreiben, das Verhalten ist dann aber undefiniert und führt in der
Regel zu einem Programmcrash.
Grüße, Torsten
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Tue May 18, 2004 3:05 pm Post subject: Re: letzten Zeilen einer Datei auslesen |
|
|
Marc Gerritzen wrote:
| Quote: |
Hallo,
wie kann ich nicht in wahlose Speicherbereiche schreiben? Kann ich nicht einfach einen Array mit der Größe [745] machen und dann von [0] bis [745] reinschreiben?
|
Natuerlich kannst Du das, aber Du machst es nicht
Wenn Dein Pgm endlich bei der ersten Zeile angelangt ist, die
Du im Array zwischenspeichern willst, hat 'zeilen' nicht mehr den Wert
0 -> Dein Programm macht ganz was anderes.
Tip von mir: setze die Konstante 745 mal runter auf etwas
handhabbareres (3 oder 5 oder 10, je kleiner desto besser) und
steppe mal in Deinem Debugger die Sequenz durch und schau
Dir die angekreidete Zeile im Detail an. Dann wirst Du
sehen, das Du das Array kraeftig ueberlaeufst.
Was Du brauchst koennte so ausschauen:
unsigned int zeilen = 0;
unsigned int LetzteZeilen = 0;
....
if(indat)
...
if( zeilen >= .....
{
Daten[LetzteZeilen] = inp;
LetzteZeilen++;
zeilen++;
}
else
zeilen++;
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Andreas Huennebeck Guest
|
Posted: Tue May 18, 2004 3:13 pm Post subject: Re: letzten Zeilen einer Datei auslesen |
|
|
Marc Gerritzen wrote:
| Quote: | wie kann ich nicht in wahlose Speicherbereiche schreiben?
|
Das kannst Du, wenn Du mit den Konsequenzen leben kannst ;-)
| Quote: | Kann ich nicht einfach einen Array mit der Größe [745] machen
|
klar.
| Quote: | und dann von [0] bis [745] reinschreiben?
|
Nein, nur von [0] bis [744].
Tschau
Andreas
--
Andreas Hünnebeck | email: [email]ah (AT) despammed (DOT) com[/email]
----- privat ---- | www : http://www.huennebeck-online.de
Fax/Anrufbeantworter: 0721/151-284301 o. 0180/50525-5232659 (24 Pfg/Min)
SMS: D1=72617 D2=0172/7366-042 E-Plus=0177/7934-396 Viag=0179/2029-894
GPG-Key: http://www.huennebeck-online.de/public_keys/andreas.asc
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Tue May 18, 2004 3:26 pm Post subject: Re: letzten Zeilen einer Datei auslesen |
|
|
Karl Heinz Buchegger wrote:
| Quote: |
Marc Gerritzen wrote:
Hallo,
wie kann ich nicht in wahlose Speicherbereiche schreiben? Kann ich nicht einfach einen Array mit der Größe [745] machen und dann von [0] bis [745] reinschreiben?
Natuerlich kannst Du das, aber Du machst es nicht
Wenn Dein Pgm endlich bei der ersten Zeile angelangt ist, die
Du im Array zwischenspeichern willst, hat 'zeilen' nicht mehr den Wert
0 -> Dein Programm macht ganz was anderes.
Tip von mir: setze die Konstante 745 mal runter auf etwas
handhabbareres (3 oder 5 oder 10, je kleiner desto besser) und
steppe mal in Deinem Debugger die Sequenz durch und schau
Dir die angekreidete Zeile im Detail an. Dann wirst Du
sehen, das Du das Array kraeftig ueberlaeufst.
Was Du brauchst koennte so ausschauen:
unsigned int zeilen = 0;
unsigned int LetzteZeilen = 0;
....
if(indat)
...
if( zeilen >= .....
{
Daten[LetzteZeilen] = inp;
LetzteZeilen++;
zeilen++;
}
else
zeilen++;
|
Uebrigens: Warum machst Du das ganze so kompliziert.
Wenn Du weist, das das File aus n Zeilen besteht und Du
nur die letzten m Zeilen brauchst, dann ist es doch
am aller einfachsten, wenn Du n - m Zeilen ueberliest
und ganz einfach nichts damit tust. Danach eine 2.te
Schleife hochziehen, die m Zeilen einliest und sie
verarbeitet. Dadurch wird auch die ganze Indexberechnung
wesentlich einfacher und ueberschaubarer.
for( i = 0; i < zeilen - 745; ++i )
getline( indat, inp );
for( i = 0; i < min( zeilen, 745 ); ++i ) {
getline( Daten[i], inp );
}
oder mit einer zusaetzlichen Variablen
ZeilenAmEnde = min( zeilen, 745 );
UeberspringeZeilen = max( 0, zeilen - ZeilenAmEnde );
for( i = 0; i < UeberspringeZeilen; ++i )
getline( indat, inp );
for( i = 0; i < ZeilenAmEnde; ++i ) {
getline( Daten[i], inp );
}
Jetzt muesste auch der letzte 'Blinde' sehen koennen worums
hier geht. Was natuerlich noch fehlt ist ein Fehlerhandling,
schliesslich koennte ja die Datei fehlerhaft sein.
Uebrigens, die min und max sind dann notwendig, wenn die
Datei weniger als 745 Zeilen aufweist.
Was man jetzt noch ankreiden koennte, ist die Tatsache,
dass Du die Datei ja in Wirklichkeit 2 mal liest:
einmal um die Anzahl der Zeilen festzustellen und
das 2-te mal um die interessierenden Zeilen rauszufischen.
Das geht auch besser, aber das ist eine andere Geschichte.
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Tue May 18, 2004 3:36 pm Post subject: Re: letzten Zeilen einer Datei auslesen |
|
|
Marc Gerritzen wrote:
| Quote: |
ich schreibe in einen Array um später das ganze zeilenweise zu Parsen.
On Tue, 18 May 2004 12:01:31 +0200
Karl Heinz Buchegger <kbuchegg (AT) gascad (DOT) at> wrote:
Frage: Warum speicherst Du das Ganze ueberhaupt in einem Array
zwischen. Wenn Du nur eine Ausgabe willst brauchst Du das
doch gar nicht.
Habe zu dem Problem nun folgende Lösung gefunden:
void GetData(string strPath)
{
ifstream file(strPath.c_str());
string datebuf,timebuf;
int ACbuf,DCbuf,WHbuf;
int linie=0;
string line;
while(getline(file,line))
{
stringstream stream(line);
if(!(stream >> datebuf >> timebuf >> ACbuf >> DCbuf >> WHbuf))
{
data.AC[linie]=0;
data.DC[linie]=0;
data.WH[linie]=0;
data.Date[linie]=datebuf;
data.Time[linie]=timebuf;
cout <<"Zeile:"<
linie++;
continue;
}
data.AC[linie]=ACbuf;
data.DC[linie]=DCbuf;
data.WH[linie]=WHbuf;
data.Date[linie]=datebuf;
data.Time[linie]=timebuf;
linie++;
}
}
meint ihr das ist sinnvoll um eine Datei mit diesem Format zu parsen:
|
Irgendwie macht das ganze noch nicht so richtig Sinn.
Zuerst mal: Hat sich die Aufgebenstellung geaendert? Begonnen hat
alles damit, das Du nur die letzten n Zeilen aus der Datei wolltest.
Aber zurueck zum Code.
Was ist der Sinn des if mitten in der while Schleife? Es kann nur
einen Sinn geben: Wenn beim lesen aus dem stringstream was schief
geht dann gibts eine Spezialbehandlung: dann werden AC, DC und WH aus
0 gesetzt. Seltsamerweise werden aber datebuf und timebuf so uebernommen
als ob der Lesefehler nie aufgetreten waere.
Wizigerweise geht's dann aber ganz normal weiter und im naechsten data
Eintrag werden die gelesenene (oder auch nicht gelesenen) Wert gespeichert.
Das kann so doch nicht stimmen. Das ergibt keinen Sinn.
Was willst Du machen? Wie sieht die Aufgabenstellung aus?
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Marc Gerritzen Guest
|
Posted: Tue May 18, 2004 8:33 pm Post subject: Re: letzten Zeilen einer Datei auslesen |
|
|
Es soll eine Datei welche von einem Datenlogger einer Solaranlage jede Stunde geschrieben wird grafisch dargestellt werden.
Ich hatte mir gedacht in SDL eine Datei zu "plotten"(das würde schon alles laufen, bis auf das plotten).
Von dieser Datei sollen nur die letzten 745 Zeilen berücksichtigt werden.(habe ich in die neue Funktion noch nicht eingebaut). Ich wollte die letzten n Zeilen um darauf einen parser aufzubauen. Doch ich hab nun durch Zufall in einem C++-Forum einen Hinweis auf obige Lösung gefunden(welche mir die Zeilen schon parst).
Die Datei hat öfter "leere" Datumseinträge. Also das Datum ist vorhanden, jedoch wird kein Wert in die Datei geschrieben. Diesen ersetze ich durch die if-Abfrage(wenn Zeile x nicht in 5 Spalten unterteilbar(da 3 nicht reingeschrieben wurden) erzeuge dafür 3mal die 0(soll in einer späteren Version interpoliert werden).
Die Datei hat dieses Format:
Datum Arbeit AC[Wh] Arbeit DC[Wh] Strahlung[Wh/m²]
12.10.2003 14:00 364 474 86
12.10.2003 15:00 481 623 85
12.10.2003 16:00 505 652 59
12.10.2003 17:00 352 455 54
On Tue, 18 May 2004 17:36:46 +0200
Karl Heinz Buchegger <kbuchegg (AT) gascad (DOT) at> wrote:
| Quote: | Irgendwie macht das ganze noch nicht so richtig Sinn.
Zuerst mal: Hat sich die Aufgebenstellung geaendert? Begonnen hat
alles damit, das Du nur die letzten n Zeilen aus der Datei wolltest.
Aber zurueck zum Code.
Was ist der Sinn des if mitten in der while Schleife? Es kann nur
einen Sinn geben: Wenn beim lesen aus dem stringstream was schief
geht dann gibts eine Spezialbehandlung: dann werden AC, DC und WH aus
0 gesetzt. Seltsamerweise werden aber datebuf und timebuf so uebernommen
als ob der Lesefehler nie aufgetreten waere.
Wizigerweise geht's dann aber ganz normal weiter und im naechsten data
Eintrag werden die gelesenene (oder auch nicht gelesenen) Wert gespeichert.
Das kann so doch nicht stimmen. Das ergibt keinen Sinn.
Was willst Du machen? Wie sieht die Aufgabenstellung aus?
|
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Marc Gerritzen Guest
|
Posted: Tue May 18, 2004 8:39 pm Post subject: Re: letzten Zeilen einer Datei auslesen |
|
|
danke für diese und die anderen Antworten zu der Frage.
Hatte immer im Hinterkopf, dass ein int-wert mit dem ich durchzähle bei 1 beginnt und nicht bei 0.
On Tue, 18 May 2004 15:00:16 +0000 (UTC)
[email]schneider (AT) mabi (DOT) de[/email] (Torsten Schneider) wrote:
| Quote: | Marc Gerritzen <Marc.Gerritzen (AT) t-online (DOT) de> wrote:
wie kann ich nicht in wahlose Speicherbereiche schreiben? Kann ich
nicht einfach einen Array mit der Größe [745] machen und dann von [0]
bis [745] reinschreiben?
Nein, nur von 0 bis 744.
Du versuchst aber, beispielsweise bei einer 2000 Zeilen langen Datei in
[1999] zu schreiben, und das geht in die Hose.
In C++ und auch in C ist es problemlos möglich, über Arraygrenzen hinweg
zu schreiben, das Verhalten ist dann aber undefiniert und führt in der
Regel zu einem Programmcrash.
|
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Wed May 19, 2004 9:06 am Post subject: Re: letzten Zeilen einer Datei auslesen |
|
|
Marc Gerritzen wrote:
| Quote: |
Es soll eine Datei welche von einem Datenlogger einer Solaranlage jede Stunde geschrieben wird grafisch dargestellt werden.
Ich hatte mir gedacht in SDL eine Datei zu "plotten"(das würde schon alles laufen, bis auf das plotten).
Von dieser Datei sollen nur die letzten 745 Zeilen berücksichtigt werden.(habe ich in die neue Funktion noch nicht eingebaut). Ich wollte die letzten n Zeilen um darauf einen parser aufzubauen. Doch ich hab nun durch Zufall in einem C++-Forum einen Hinweis auf obige Lösung gefunden(welche mir die Zeilen schon parst).
Die Datei hat öfter "leere" Datumseinträge. Also das Datum ist vorhanden, jedoch wird kein Wert in die Datei geschrieben. Diesen ersetze ich durch die if-Abfrage(wenn Zeile x nicht in 5 Spalten unterteilbar(da 3 nicht reingeschrieben wurden) erzeuge dafür 3mal die 0(soll in einer späteren Version interpoliert werden).
|
alles schoen und gut, nur fehlt Dir dann midestens ein 'else'
if( Daten konnten nicht fehlerfrei geparst werden )
erzeuge einen Standarddatensatz
else
nimm die Daten
(OOps. Ich hatte gerade den Reply praktisch fertig, als ich den continue
im 'then' Teil entdeckt habe. Mach doch sowas nicht! Damit rechnet keiner.
Auch wenn Du das jetzt noch weist, in spaetestens einem halben Jahr ist sowas
ein Eigentor. Das ist schon hart an der Spaghetti-Programmierung und wird
zurecht gebrandmarkt. Wenn Du schon vorzeitig die naechste Schleifeniterierung
mittels continue ausloesen willst, dann mach das ganze so, dass der continue
optisch hervorsticht. Sowas muss der Blindenhund eines Blinden auf 500 Meter
Entfernung mit verbundenen Augen erkennen koennen.)
Allerdings wuerde ich das ganze umdrehen, damit der Standardfall
im then Teil zu stehen kommt
if( Daten konnten gelesen werden )
Nimm die Daten
else
Nimm Standarddaten
oder noch simpler
if( Daten konnten nicht gelesen werden )
Setze die Variablen auf Standardwerte
Verarbeite den Datensatz
In Code
while(getline(file,line))
{
stringstream stream(line);
if(!(stream >> datebuf >> timebuf >> ACbuf >> DCbuf >> WHbuf))
{
ACbuf = 0;
DCbuf = 0;
WHbuf = 0;
}
data.AC[linie] = ACbuf0;
data.DC[linie] = DCBuf;
data.WH[linie] = WHBuf;
data.Date[linie] = datebuf;
data.Time[linie] = timebuf;
cout <<"Zeile:"<
linie++;
}
}
( Zum Ooops:
Siehst Du wie hier alles gradlinig durchlaeuft? Da gibt es keine grossen
Ueberraschungen. Kein Code ist dupliziert und nirgends wird in der
Schleife gesaubeutelt.
)
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Marc Gerritzen Guest
|
Posted: Wed May 19, 2004 12:48 pm Post subject: Re: letzten Zeilen einer Datei auslesen |
|
|
ja das stimmt schon. Werde das im Code ändern. danke
so... dann mach ich mich mal an das plotten mit sdl.
| Quote: | alles schoen und gut, nur fehlt Dir dann midestens ein 'else'
if( Daten konnten nicht fehlerfrei geparst werden )
erzeuge einen Standarddatensatz
else
nimm die Daten
(OOps. Ich hatte gerade den Reply praktisch fertig, als ich den continue
im 'then' Teil entdeckt habe. Mach doch sowas nicht! Damit rechnet keiner.
Auch wenn Du das jetzt noch weist, in spaetestens einem halben Jahr ist sowas
ein Eigentor. Das ist schon hart an der Spaghetti-Programmierung und wird
zurecht gebrandmarkt. Wenn Du schon vorzeitig die naechste Schleifeniterierung
mittels continue ausloesen willst, dann mach das ganze so, dass der continue
optisch hervorsticht. Sowas muss der Blindenhund eines Blinden auf 500 Meter
Entfernung mit verbundenen Augen erkennen koennen.)
Allerdings wuerde ich das ganze umdrehen, damit der Standardfall
im then Teil zu stehen kommt
if( Daten konnten gelesen werden )
Nimm die Daten
else
Nimm Standarddaten
oder noch simpler
if( Daten konnten nicht gelesen werden )
Setze die Variablen auf Standardwerte
Verarbeite den Datensatz
In Code
( Zum Ooops:
Siehst Du wie hier alles gradlinig durchlaeuft? Da gibt es keine grossen
Ueberraschungen. Kein Code ist dupliziert und nirgends wird in der
Schleife gesaubeutelt.
|
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Kai Ruhnau Guest
|
Posted: Thu May 20, 2004 11:55 am Post subject: Re: letzten Zeilen einer Datei auslesen |
|
|
Karl Heinz Buchegger wrote:
[snip]
| Quote: |
while(getline(file,line))
{
stringstream stream(line);
if(!(stream >> datebuf >> timebuf >> ACbuf >> DCbuf >> WHbuf))
{
ACbuf = 0;
DCbuf = 0;
WHbuf = 0;
}
data.AC[linie] = ACbuf0;
data.DC[linie] = DCBuf;
data.WH[linie] = WHBuf;
data.Date[linie] = datebuf;
data.Time[linie] = timebuf;
cout <<"Zeile:"<
linie++;
}
}
|
Was ist mit folgender Variante, die nichtmal überprüfen muss, ob das
Lesen funktioniert hat:
while(getline(file,line))
{
stringstream stream(line);
data.AC[linie] = 0;
data.DC[linie] = 0;
data.WH[linie] = 0;
stream >> data.Date[linie] >> data.Time[linie];
stream >> data.AC[linie] >> data.DC[linie] >> data.WH[linie];
cout <<"Zeile:"<
linie++;
}
Je nach dem, welche Werte in der Zeile vorhanden sind, werden nur diese
in den Variablen gespeichert. Stehen keine Werte in der Zeile, dann
bleibt es bei den Default-Werten.
Grüße
Kai
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|