jbuftest
Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Aufgabe 9
Hallo,
will mich nicht über die Bereitstellung schöner netter Hilfsprogramme beschweren…
Aber wenn wir die jbuftest.c aus dem pub-Verzeichnis nehmen sollen, dann solle dort auch die jbuffer.h liegen (wenn sie schon im include steht!).
Hab mir die Datei in mein Verzeichnis kopiert, ist das so gewollt? Weil in der Angabe steht will sollen und die Datei von dort während dem Kompilieren holen, zumindest versteh ich das so!
Vielen Dank!
Außerdem hab ich ein Problem im makefile (scheinbar):
Ich führe aus und folgendes kommt raus:
faui05c [aufgabe9]> make jbuftest.o
gcc -ansi -pedantic -Wall -Werror -D_POSIX_SOURCE -D_XOPEN_SOURCE=500 -c i4sem.c
gcc -ansi -pedantic -Wall -Werror -D_POSIX_SOURCE -D_XOPEN_SOURCE=500 -c jbuffer.c
in meinem Makefile habe ich aber die Zeilen:
.c.o:
$(CC) $(CFLAGS) -c $<
jbuftest.o: jbuffer.h
Und soweit ich weiß müsste er die jbuftest.o von selbst erstellen… Aber?
edit:
gcc -ansi -pedantic -Wall -Werror -D_POSIX_SOURCE -D_XOPEN_SOURCE=500 -c jbuftest.c
klappt ohne Probleme…
Das Modul jbuffer soll von euch erstellt werden, dazu gehoert auch der Header jbuffer.h. Nachdem jbuftest dieses Modul verwendet bindet es
auch den Header ein.
Ob Du jbuftest nun kopierst oder nicht kannst Du Dir aussuchen. Wichtig ist, dass die Regeln in den Makefiles die einzlnen Module nur bei Bedarf (= Quelldateien neuer als Zieldatei oder Zieldatei gar nicht vorhanden) neu erzeugen.
Woran das mit Deinem Makefile liegt kann ich Dir so nicht sagen, aber wie man sieht wird nicht die von Dir definierte implizite Regel ausgefuehrt sondern ein anderes Target (?)
Welches auch immer… ich berichte G
Aber das darf mein mitschreiber für mich lösen, der kennt sich immer überall aus g
Ok, das Makefile stimmt und stimmte auch von allen Anfgang an!
Zu dem letzten Hinweis auf dem Blatt: Die Funktionen unbufio würde ich definitiv nicht nehmen. Denn was da an FD->FILESTREAM immerzu hin und hergewandelt wird, ist ja schamhaft… Also ne, und dann wirds eh nur auf ein read/write abgebildet… das könnte ich auch selbst ohne das ganze Klimbims außen rum… Versteh ich nicht! :wand:
Außerdem würde ich gerne wissen, warum wir standardmäßig mit putc und getc arbeiten sollen. Dann haben wir den Stream ja 3 Mal gepuffert. Was bringt das für Vorteile? Oder welchen Sinn macht dies?
Die Funktionen dienen einfach der ungepufferten Ein- und Ausgabe,
und um vom Terminal ungepuffert lesen zu koennen muss man
nunmal den Terminaltreiber umstellen. Schoener ist es sicher, wenn
man das zu Beginn seiner Programms einmal macht und zum Ende
die alten Einstellungen wiederherstellt, aber nachdem wir das Programm
nicht schreiben ist es fuer uns nunmal so einfacher. Wir wollten auch
keine Signalhandler installieren, da das ja mit evtl. Handlern von euch
wieder Konflikte geben koennte. Vorteil ist, dass man z.B. wenn man
von stdin ueber den Ringpuffer nach stdout liest, sofort beim druecken
der Taste die Ausgabe kriegt und nicht erst immer nach einem newline.
Eine Wandlung von FD->Filestream kann ich unbufio.c auf die Schnelle
nicht finden. Dass man einen FILE* wieder auf den filedeskriptor runterbricht um die stdio zu umgehen ist ja wohl klar. Was glaubst
Du was fgets und Konsorten mit dem FILE* machen
den sie kriegen…
Es ist am einfachsten. Du darfst gerne read und write verwenden.
Uebrigens steht nirgendwo in der Aufgabe, dass nur wir ein getc und putc auf read und write abbilden koennen.
und hier noch was bei der schamhaften fileno umwandlung passiert
int fileno (fp) _IO_FILE* fp;
{
CHECK_FILE (fp, EOF);
if (!(fp->_flags & _IO_IS_FILEBUF) || _IO_fileno (fp) < 0)
{
__set_errno (EBADF);
return -1;
}
return _IO_fileno (fp);
}
iolibio.h:#define _IO_fileno(FP) ((FP)->_fileno)
Hi alle zusammen,
ich habe ein Problem’chen hoffentlich könnt ihr mir helfen.
Die Funktion jbuffer bekommt ja zwei Filedeskriptoren (int).
getc, putc arbeiten aber ja mit Zeigern auf Streams.
Jetzt gibt es ja die Funktion fileno um den Integerwert zu einem File* zu bekommen. Aber wie heißt die Funktion in die andere Richtung wenn es sowas überhaupt gibt?
Und in der Aufgabenstellung steht ja, dass man getc bzw. putc verwenden soll bzw. fgetch oder fputch aus der unbufio.c.
Irgendwie habe ich mit dem einlesen der Daten so meine Probleme.
Verwende ich die Funktion getch() kann ich zwar mit meinen Filedeskriptor (int) arbeiten aber ich bin nicht in der Lage EOF festzustellen… Da die Funktion getch() wie ich gesehen habe immer 0 zurückgibt egal wieviele Bytes gelesen wurde.
Ich hoffe mir kann jmd. helfen.
Dankeschön!!
Filedeskriptor (int) → FILE * : fdopen
FILE * → Filedeskriptor (int) : fileno
Du musst nicht getc und putc verwenden das ist lediglich ein Beispiel. Du kannst auch read und write verwenden. Ansonsten hast Du recht getch
ist wirklich etwas doof an der Stelle. Am besten wirfst Du die Zeile
if (ret>0) return 0;
einfach raus dann sollte es klappen.
Ich habe jetzt auch read und write verwendet, finde ich fast angenehmer.
Irgendwie sieht man mehr was man macht
Naja auf jeden Fall vielen Dank für die schnelle Antwort ist echt klasse so ein Forum.
Schönes Wochenende noch!