Anzahl zu lesender Zeichen herausfinden
-
ich kann aus einer geöffneten Datei mittels
anz = read(fp, data, count);
count Daten lesen, dabei gibt mir anz die Anzahl der tatsächlich gelesenen Daten zurück.
Nun meine Frage:
Wie kann ich herausfinden wieviele Zeichen denn gelesen werden können, ohne diese tatsächlich zu lesen?
-
z.b. mit stat() ( man 3 stat )
-
komisch - aber bei mir gibt es stat(3) nicht - wohl stat(1) aber das scheint was anderes zu sein.
Gibt es noch eine andere Lösung, da du "z.B." geschrieben hast?
-
wie gibts nicht ? ist doch eine posix funktion. du hast vielleicht die man page nicht installiert. also ich mach das so:
#include <sys/stat.h> { struct stat sStat; int size; int statval; statval = stat (filePath, &sStat); if (statval < 0) // File Not Found if (S_ISREG(sStat.st_mode) == FALSE) // Not a regular file size = sStat.st_size; // weiter mit open() und mmap(), bzw. fopen(), read() }
-
ahhh, glaub ich weis was du meinst, aber wir reden glaube ich aneinander vorbei...
Ich werde versuchen es anders zu beschrieben:
ich lese von einem device (soll hier mal die Tastatur, also stdin sein) das (zufällig) Zeichen liefert. Ich möchte nun an einer Stelle in meinem Programm prüfen ob Zeichen gesendet wurden und wenn ja diese lesen ohne das das Programm blokiert.
-
das klingt jetzt aber schon ganz anders als deine ursprüngliche frage.
da könnte select(3) dein freund werden (solltest dir mal die posix man-pages
installieren; findet man aber auch alles als html im web).
-
Hm, irgendwie hatte ich die ursprüngliche Frage auf Anhieb richtig interpretiert
Also für read scheints da nicht wirklich was zu geben (wofür brauchst Du das denn?). Select/Poll sagen Dir auch nur ob es was zu lesen gibt, aber nicht wieviel. Für den recv-Befehl (Sockets) gibt es das Flag MSG_PEEK was die Daten in der Warteschlange lässt, also beim nächsten Aufruf nochmal dieselben Daten liefert. Für read hab ich grad nix gefunden.
Allerdings denke ich, dass das eh nicht viel Sinn macht da so eine Abfrage nicht atomic wäre. Sprich es ist nicht garantiert, dass zwischen der Abfrage und dem tatsächlichen Lesen der Daten nicht noch weitere Daten eingetroffen sind...
-
Je nach Device kann man mittels man: ioctl(2) oder man: fcntl(2) Informationen über die zu lesende Anzahl an bytes erfahren.
@atomfish
man: stat(2) und man: select(2) liegen in Sektion 2 der Manpages, da es System Calls und keine C Library Funktionen (Sektion 3) sindbtw. gibt es auch man Tags, wie ich gerade demonstriert hab
-
ok, Danke erstmal!
habe es jetzt etwas anders gelöst, ich öffne das Device mit open, setze mit tcsetattr dann die Attribute neu, wobei ich dabei eben auf diesen Canonischen Modus verzichte.
Eigentlich läuft es schon perfekt, aber beim Test mit der standarteingabe (/dev/tty) habe ich manchmal trotz ausgeschaltetem echo eine Ausgabe, woran mag das nun wieder liegen