[C++] Datei einlesen, und immer aktualieren, wenn das Original geändert wird

Abbreviation

Mitglied

Hi alle!

Ich will eine Datei einlesen, und immer wenn die Datei geändert wird sozusagen an der letzten Zeile mit dem Einlesen weiter machen. Geht das?
(In der Datei sollen immer nur Zeilen hinzugefügt werden)
Vor allem:

* Wie finde ich raus, wenn die Datei geändert wird?
* Wie finde ich heraus, welches die erste neue Zeile ist

Ich lese die Datei zeilenweise ein (mit fgets()).

Tausend Dank!

lG
Marei
 
Zuletzt bearbeitet:
also falls du Windows benutzt:

mit der Funktion GetFileTime (nicht sonderlich elegant) kannst du jeweils feststellen, wann in eine Datei zum letzten mal geschrieben wurde. Wenn du das nicht die ganze Zeit überprüfen willst, gibt es noch FindFirstChangeNotification, wie das genau tut, weiss ich nich, ich hab die Fkt nur mal gesehen, nicht ausprobiert. Aber Hilfe dazu lässt sich wie zu den anderen Funktionen, von denen du nicht weisst, wie sie aufzurufen sind, in der Msdn (gibts auch online: http://msdn.microsoft.com/ ) nachschlagen. Genauere Infos über Dateien bekommst du übrigens auch mit FindFirstFile/_findfirst.

Wie du die letzte Zeile rausfindest:
Erst liest du die Datei ja ein. Jetzt speicherst du den Offset, an dem du stehengeblieben bist (SetFilePointer), oder falls das garantiert das Ende der Datei war die Dateilänge (GetFileSize).
Wenn jetzt am Schluss etwas hinzugefügt wurde, kannst du per SetFilePointer wieder an den gespeicherten Offset zurückkehren und dort weiterlesen.
Allerdings solltest du das nur machen, wenn du sicherstellen kannst, das keine unberechtigte Applikation die Datei beschreibt.

Ein gültiges Windows-HANDLE, dass für die Winapi-Funktionen ja benötigt wird, holst du dir mit:
HANDLE hFile = _get_osfhandle(_fileno(file));
falls FILE* file dein Dateizeiger ist.


Edit: Falls du die Datei die ganze Zeit geöffnet behälst und nicht die Position veränderst, brauchst du natürlich nichtmal den Dateizeiger speichern und neu setzen.
PS: auf Stdio-Ebene kannst du Dateizeiger auch mit ftell lesen und mit fseek setzen oder mit _filelength(_fileno(file)) die Dateilänge herausfinden (damit könntest du zB auch überprüfen, ob etwas dazugeschrieben worden ist), falls du die Winapi nicht verwenden willst/kannst, ist aber alles nicht so schön...

Edit2: shit, nochmal Rechtschreibfehler gefunden ;) -> Oh, ich bin ja so gewissenhaft geworden....
 
Zuletzt bearbeitet:
Hi,
noch ein paar Folgefragen:

* Ist es arg schlimm, die Datei die ganze Zeit geöffnet zu behalten, oder kann man das vernachlässigen?

* Das mit der FindFirstChangeNotification scheint ein guter Tipp zu sein. Die Funktion gibt mir dann ein change notification handle, mehr brauch ich doch nicht, oder?

Danke!
Marei
 

* Ist es arg schlimm, die Datei die ganze Zeit geöffnet zu behalten, oder kann man das vernachlässigen?
Ob das für FindFirstChangeNotification verwirrend sein könnte, weiss ich nicht. Aber du musst die Datei wenigstens so öffnen, dass eine andere App Schreibzugriff hat. (bei CreateFile zb FILE_SHARE_WRITE glaub)

* Das mit der FindFirstChangeNotification scheint ein guter Tipp zu sein. Die Funktion gibt mir dann ein change notification handle, mehr brauch ich doch nicht, oder?
Wenn du ein Handle hast, kannst du mit WaitForSingleObject oder WaitForMultipleObject warten, bis es im Signaled-State ist -> der wird gesetzt, wenn eine ChangeNotification des spezifizierten Filters vorliegt.
-> also: ich weiss hier auch nicht mehr als die msdn
 
Zurück