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 funktion

    FILE *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) , wo buffer nicht initialisiert ist. Du weißt was das heißt, oder?

    es sollte heißen

    stream = fmemopen(buffer, sizeof (buffer), "r+");
    
    1. buffer ist nur innerhalb von getmystream 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 per write() 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 mit fmemopen() möglich?
    Würde mir vielleicht fopencookie() weiterhelfen.
    Man kann dort eine eigene write-Funktion angeben, welche aber komischerweise nach einem write() nicht ausgeführt wird...

    Hallo klassik0r,
    ich glaube du hast mich falsch verstanden, es geht um die Kommunikation Programm <-> Programm und nicht Programm <-> Datei

    Viele Grüße


Log in to reply