Forum: PC-Programmierung Dateistream "abfangen"


von Jan L. (jan_l)


Lesenswert?

Hallo,

Ich hab im Moment ein Tool, was mir Daten in eine CSV Datei schreibt. 
Das macht es wohl kontinuierlich, da die Datei stätig größer wird. 
Leider habe ich keinen Zugriff auf den Quellcode von dem Programm. Jetzt 
hab ich mich gefragt ob es möglich ist, diesen Stream in die Datei 
irgendwie abzufangen um die Daten gleich weiter verwenden zu können?

Kennt da vielleicht jemand passende Stichworte oder kann mir gleich 
weiterhelfen? Programmiersprache währe erst mal egal, da es nur für 
einen ersten Test dienen soll(ausgeschlossen brainf*** und whitespace 
:P).

Wenn dieses Abfangen nicht möglich ist wäre meine nächste Idee die CSV 
Datei auszulesen.

Hier weiß ich allerdings nicht, ob dies möglich ist während auf sie zu 
gegriffen wird bzw auf sie geschrieben wird. Optimal wäre es natürlich 
wenn ich die Daten (fast) live aus der CSV ziehen könnte.

Auch hier wieder hat jemand Stichpunkte die mir in dem Thema weiter 
helfen? bzw kann mir jemand weiterhelfen? oder sind die Ideen eh 
völliger Käse?

Viele Grüße
Jan

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jan L. schrieb:
> Hier weiß ich allerdings nicht, ob dies möglich ist während auf sie zu
> gegriffen wird bzw auf sie geschrieben wird.

Ausprobieren. Programm laufen lassen, Notepad aufrufen und Datei öffnen.

Programme wie Excel (die sich gerne standardmäßig mit CSV-Dateien 
verknüpfen) blockieren die geöffnete Datei, so daß das erzeugende 
Programm das nicht mehr kann. Notepad ist hier zurückhaltender.

Ein weiterer Test:
Lässt sich die CSV-Datei im Betrieb löschen? Wenn ja, wird mit dem 
nächsten Schreibzugriff des erzeugenden Programmes gleich eine neue 
angelegt?

Dann bist Du aus dem Schneider.

von fonsana (Gast)


Lesenswert?

Mit less kannst Du eine Datei anzeigen, in die geschrieben wird. Ein 
grosses F schaltet dann ein, dass alle neuen Daten sofort angezeigt 
werden.

fonsana

von Simon B. (nomis)


Lesenswert?

Jan L. schrieb:
> Ich hab im Moment ein Tool, was mir Daten in eine CSV Datei schreibt.
> Das macht es wohl kontinuierlich, da die Datei stätig größer wird.
> Leider habe ich keinen Zugriff auf den Quellcode von dem Programm. Jetzt
> hab ich mich gefragt ob es möglich ist, diesen Stream in die Datei
> irgendwie abzufangen um die Daten gleich weiter verwenden zu können?

Arbeitest Du unter Linux? Da habe ich (vor Jahren) ähnliche Dinge mit 
dem LD_PRELOAD-Mechanismus gemacht: einmal habe ich Audio-Streams vom 
Real-Player ins Audio-Device abgegriffen und direkt auf die Platte 
gebannt bzw. scp-Verbindungen in ihrer Bandbreite beschränkt. Für 
letzteres hatte ich den Sourcecode mal "veröffentlicht":
   http://www.home.unix-ag.org/simon/files/bandwidth.tar.gz

Ist bestimmt etwas vor sich hin gebitrotted, aber das Prinzip sollte so 
gehen.

Viele Grüße,
        Simon

von Jan L. (jan_l)


Lesenswert?

Also erster Test. C++ Stört es nicht, wenn ich zb die TXT Datei mit 
Notepad offenhabe. Er list Trotzdem alles, was beim Zeitpunkt des 
Ausführens gespeichert ist.

hab das einfach irgendwo rauskopiert
1
#include <fstream>
2
#include <iostream>
3
using namespace std;
4
5
int main(int argc, char *argv[])
6
{
7
    fstream f;
8
    char cstring[256];
9
    f.open("testDatei.txt", ios::in);
10
    while (!f.eof())
11
    {
12
        f.getline(cstring, sizeof(cstring));
13
        cout << cstring << endl;
14
    }
15
    f.close();
16
  system("pause");
17
}


und zu den tests, Löschen kann ich die Datei leider nicht, da auf sie 
zugegriffen wird...
öffnen kann ich sie allerdings, doch dann bekomm ich den Stand den die 
Datei beim öffnen hatte.

Leider arbeite ich mit Windows. Allerdings werde ich dann mal überlegen 
(vorrausgesetzt ich bekomms hin) mal Linux zu installieren bzw ne VM zu 
erstellen

von troll (Gast)


Lesenswert?

Simon Budig schrieb:
> Ist bestimmt etwas vor sich hin gebitrotted,
Sorry, ist was? Nicht mal Google kennt dieses Wort...

von Simon B. (nomis)


Lesenswert?

troll schrieb:
> Simon Budig schrieb:
>> Ist bestimmt etwas vor sich hin gebitrotted,
> Sorry, ist was? Nicht mal Google kennt dieses Wort...

Pardon. "bitrot" bezeichnet das langsame Veralten von Code, den man seit 
Jahren nicht mehr angeguckt hat und der aus komischen Gründen (neue 
Compiler etc.) jetzt nicht mehr Stand der Technik ist bzw. "neue" Bugs 
enthält.

"gebitrotted" ist eine schlecht eingedeutschte Beschreibung für dieses 
Geschehen   :)

Viele Grüße,
        Simon

von Jan L. (jan_l)


Lesenswert?

also ich hatte jetzt eine Idee an deren Umsetzung ich grade sitze.
Ich dachte mir (auch wenn es geschwindigkteistechnisch bestimmt sehr 
schlecht ist) das in etwa so zu machen:
1
 while (1)
2
    {
3
    if (f.getline(cstring, sizeof(cstring))!=NULL){
4
      cout << cstring << endl;
5
    }else{
6
      f.close();
7
      f.open("testDatei.txt", ios::in);
8
    }
9
    }

Heißt einfach, vorerst pack ich alles in eine Endlosschleife. da prüfe 
ich dann ob die nächste Zeile noch Inhalt hat (es gibt keine leeren 
Zeilen in meiner Datei) diese gibt er dann aus.

Findet er keine Zeile mehr schließt er die Datei und öffnet sie neu.
An sich ist das auch erst mal ganz ok. Allerdings müsste ich die 
gelesenen Zeilen direkt rauslöschen, da er mir diese im Moment wieder 
Ausdruck( + die neu hinzugekommenen) wie allerdings lösche ich die 
gelesene Zeile (vielleicht sogar performant)?

von snowowl (Gast)


Lesenswert?

Hallo,

unter Linux würde ich "tail -f <Dateiname>" vorschlagen.
Damit wird continuierlich das Dateiende überwacht und neu hinzugekommene 
Zeilen angezeigt.

tail ist auch Teil von Mingw (msys).

Vieleicht hilft Dir das weiter...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jan L. schrieb:
> Allerdings müsste ich die
> gelesenen Zeilen direkt rauslöschen, da er mir diese im Moment wieder
> Ausdruck( + die neu hinzugekommenen) wie allerdings lösche ich die
> gelesene Zeile (vielleicht sogar performant)?

Falscher bzw. äußerst ungünstiger Ansatz.
Wenn es möglich ist, dem CSV-Erzeuger-Programm hinterrücks die erzeugte 
Datei zu entwenden (hast Du das mittlerweile mal ausprobiert?), dann 
kannst Du die Datei zyklisch umbenennen, die umbenannte Datei in aller 
Gemütsruhe einmal auswerten und dann löschen.

von Jan L. (jan_l)


Lesenswert?

ahh also tail klappt auch super unter windows. jetzt muss ich nurmal 
schaun wie ich das am besten integrier bzw sinvoll nutzen kann

von Florian P. (db1pf)


Lesenswert?

Hallo,

du wirst die Zeilen nicht aus der Datei löschen können, da das andere 
Programm ja auch schreibend auf die Datei zugreift.

Du könntest dir höchstens merken, bis zu welcher Position du die Datei 
bisher ausgelesen hast und nach dem erneuten öffnen der Datei nur die 
Zeichen ausgeben, die danach hinzugekommen sind.

Grüße,
Florian

von Peter II (Gast)


Lesenswert?

schau dir doch einfach mal den quelltext von tail an. Oder teste mal 
ohne die Datei neu zu öffnet einfach mal ans Ende zu springen seek mit 
passenden paramter. Eventuell kannst du damit immer die akuelle größe 
abfragen. (keien Ahnung wie man das mit C++ macht, für soetwas nehme ich 
die Ansi funktionen). seek liefert dir dann den absoluten offset zurück. 
Die differenz zum vorherigen ist dann das was neu dazugekommen ist.

von Jan L. (jan_l)


Lesenswert?

soooo... Das war zwar jetzt mehr probieren wie können aber ich hab es 
soweit hinbekommen.

es sieht jetzt folgendermaßen aus:
1
while (1)
2
{
3
    if (f.getline(cstring, sizeof(cstring))!=NULL){
4
      cout << cstring << endl;
5
      posg = f.tellg();
6
7
    }else{
8
      f.close();
9
      f.open("C:\\Debug2013.4.3_15.54.24.csv", ios::in);
10
      f.seekg(posg, ios::beg);
11
    }
12
}

ich merk mir einfach die position die ich grade gelesen habe. und wenn 
ich die datei neu öffne springe ich genau an diese Position.

Ich muss es nur noch testen, was bei der Menge an Daten im Moment noch 
recht schwer ist -> weil Unübersichtlichch.

Das Ergebnis gefällt mir zwar überhaupt nicht, da das mein Rechner 
performance mäßig kein Stück mit macht (er hat schon genug damit zu tun 
die Daten die mit ca. 70Hz kommen in die CSV zu schreiben) aber es ist 
ein Ergebnis.

Als nächstes werde ich wohl die Daten eher in einen Buffer schreiben 
schreiben um wenigstens mit der Ausgabe ein bisschen Zeit zu haben.

von Peter II (Gast)


Lesenswert?

Jan L. schrieb:
> Das Ergebnis gefällt mir zwar überhaupt nicht, da das mein Rechner
> performance mäßig kein Stück mit macht (er hat schon genug damit zu tun
> die Daten die mit ca. 70Hz kommen in die CSV zu schreiben) aber es ist
> ein Ergebnis.

was erwartest du von einer schleife ohne wartezeit? Damit lastet du 
jedes System zu 100% aus?. Eventuell sollte man ein paar ms immer mal 
warten. Auch mal ohne neu zu öffnen probieren, das kostet bloss sinnlos 
zeit.

von Tom K. (ez81)


Lesenswert?

Vielleicht kann man dem Tool auch eine named pipe anstelle der CSV-Datei 
unterschieben. Was sagen die Windows-Kenner dazu?

http://en.wikipedia.org/wiki/Named_pipe

von Win (Gast)


Lesenswert?

Das wäre der elegant Ansatz.
Das Pipe-Filessystem ist genau dafür gemacht.

von Win (Gast)


Lesenswert?

BTW, geht auch über (Windows-)Rechner Grenzen hinweg.
//Rechner/Pipe
Programmieren über Windows-API oder .NET

von Andreas B. (andreasb)


Lesenswert?

Win schrieb:
> BTW, geht auch über (Windows-)Rechner Grenzen hinweg.
> //Rechner/Pipe
> Programmieren über Windows-API oder .NET

eher:
\\.\PIPE\PipeName

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365150%28v=vs.85%29.aspx


Falls das nicht klappt wäre ggf. auch eine RAMDisk eine Option.

Eine Ramdist ist wesentlich schneller, und RAM sollte heute genug 
vorhanden sein...


mfg Andreas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.