Eigenen Stream erstellen und darauf zugreifen
-
Hallo,
ich programmiere zu Zeit eine Schnittstelle für ein C-Programm.
Die Kommunikation soll über einen Stream ablaufen, d.h. zuerst wird meine funktionFILE *getmystream()
aufgerufen, dann erfolgt über
read/write
die Ein/Ausgabe. Zum Schluss wird der Stream wieder geschlossen.
Hier ist das ganze als Code:
Datei test.c
#include <stdio.h> #include <stdlib.h> #include <strings.h> #include "mystream.c" int main(int argc, char *argv[]) { int fd = getmystream(); // write to stream fprintf(fd, "hello\n"); // read from stream size_t nbytes = 100; char *line = (char *) malloc(nbytes + 1); getline(&line, &nbytes, fd); printf("%s\n", line); close(fd); return 0; }
Datei mystream.c
#include <stdio.h> #include <stdlib.h> #include <strings.h> FILE *getmystream() { char buffer[100]; FILE *stream; stream = fmemopen(buffer, strlen (buffer), "r+"); return stream; } int close(FILE* fd) { free(fd); return 0; }
Soweit so gut. aber wie kann ich nun in der Datei mystream.c auf den Buffer zugreifen? Ich möchte zum Beispiel zuerst den Inhalt des Buffers ("hello\n") auslesen und dann etwas hineinschreiben. Muss ich eine Endlosschleife programmieren, die ständig den Inhalt des Buffers überwacht?
Habt ihr eine Idee wie ich das machen könnte?
Viele Grüße
-
Hi!
joghurt schrieb:
Ich möchte zum Beispiel zuerst den Inhalt des Buffers ("hello\n") auslesen und dann etwas hineinschreiben. Muss ich eine Endlosschleife programmieren, die ständig den Inhalt des Buffers überwacht?
Habt ihr eine Idee wie ich das machen könnte?
Viele Grüße
dein "hello\n" ist in einer datei gespeichert, nehme ich an.
die klassische lösung für dein vorhaben ist die funktionen fgets, fprintf, fputs etc., zu benutzen.mfg,
k.
-
1. per #include includiert man nur .h Dateien, keine .c Dateien.
2. du verwendest
strlen (buffer)
, wobuffer
nicht initialisiert ist. Du weißt was das heißt, oder?es sollte heißen
stream = fmemopen(buffer, sizeof (buffer), "r+");
buffer
ist nur innerhalb vongetmystream
gültig.
FILE *getmystream(char *buffer, size_t len) { if(len == 0) return NULL; return fmemopen(buffer, len, "r+"); }
man fmemopen schrieb:
If buf is specified as NULL, then fmemopen() dynamically allocates a buffer size bytes long. This is use‐
ful for an application that wants to write data to a temporary buffer and then read it back again. The
buffer is automatically freed when the stream is closed. Note that the caller has no way to obtain a
pointer to the temporary buffer allocated by this call (but see open_memstream() below).oder so
FILE *getmystream(size_t len) { if(len == 0) return NULL; return fmemopen(NULL, len, "r+"); }
-
Hi supertux,
danke für deine Vorschläge, die Probleme mit dem Buffer habe ich jetzt behoben.
Für meine Anwendung benötige ich jedoch noch so etwas wie einen "Event Handler", also wenn perwrite()
etwas in den Stream geschrieben wird, soll das geschriebene automatisch von einer Funktion gelesen und weiter verarbeitet werden. So etwas wie:write(fd, "Hello World!\n", 13); read_and_process_data(fd);
nur ohne den expliziten Aufruf der Funktion.
Ist das mitfmemopen()
möglich?
Würde mir vielleichtfopencookie()
weiterhelfen.
Man kann dort eine eigene write-Funktion angeben, welche aber komischerweise nach einemwrite()
nicht ausgeführt wird...Hallo klassik0r,
ich glaube du hast mich falsch verstanden, es geht um die KommunikationProgramm <-> Programm
und nichtProgramm <-> Datei
Viele Grüße