realisierung von gets/puts ohne fgets/fputs sondern mit read/write



  • hallo zusammen

    ich habe folgendes problem..
    wie kann ich die funktionen gets/puts definieren ohne fgets/fputs zu verwenden?
    korrigiert mich wenn ich mich irre, aber fgets/fputs benutzen eine vordefinierte filestruktur, das problem ist, dass ich zwar ebenfalls eine filestruktur benutze aber als member nur einen filedeskriptor vom typ int habe, weil ich lediglich, 0-stdin, 1-stdout, 2-stderr festlegen will.
    es reicht wenn gets NUR von stdin einen string einliest und puts NUR auf stdout einen string ausgibt

    ich will keinen vollständigen quellcode, weiß gott nicht, aber ich weiß momentan nicht wie ich es angehen soll

    schonmal danke
    mit bestem gruß



  • puts kann einfach strlen(s) Zeichen schreiben, gets liest zeichenweise, bis es ein \n trifft:

    int fd_puts(const char* src,int fd)
    {
      return write(fd,src,strlen(src));
    }
    
    char* fd_gets(char* tgt,int size,int fd)
    {
      int i;
      for(i=0;i<size-1;++i)
      {
        read(fd,tgt+i,1);
        if(tgt[i]=='\n') break;
      }
      tgt[i+1]='\0';
      return tgt;
    }
    

    PS: Was spricht denn dagegen, stdin und Co. zu verwenden? Die sind vom Typ FILE*, haben also das richtige Format für die "normalen" fgets()/fputs()-Funktionen.



  • erstmal danke CStoll
    um deine frage zu beantworten.
    die typ FILE* der in fgets/fputs verwendet wird hat aber neben dem filedeskriptor fd noch member wie MODE etc. oder irre ich mich?
    diese member sind bei mir nicht vorhanden, sondern lediglich der filedeskriptor.
    darum bekomme ich probleme wenn ich fgets und fputs verwenden will.
    oder irre ich da?



  • Was spricht denn generell dagegen, den normalen Datentyp FILE* zu benutzen? Da reicht ein #include <stdio.h> völlig aus.

    (und btw, was sich hinter dem FILE* verbirgt, ist komplett Angelegenheit des Compilers. Und da kann es durchaus sein, daß das in Wirklichkeit ein verkleideter File-Deskriptor ist ;))



  • unser dozent hat die aufgabe so definiert, von daher müssen wir es so machen wie er es will:)

    wäre eine mögliche form um gets zu definieren auch folgende?
    ich will ja keinen code kopieren um meine "hausaufgaben" zu machen sondern meinen vorhandenen verbessern:)

    char *(gets)(char *buf)
    {
    unsigned char *s = (unsigned char *)buf;
    int c;
    for (;((c = getchar()) != EOF); )
    {
    if ((*s++ = c) == '\n')
    break;
    }
    *s = '\0';
    return ((c == EOF && s == (unsigned char *)buf) ? NULL : buf);
    }

    wobie getchar() definiert ist als:

    int (getchar)(void)
    {
    int gc;
    int ret_val = 0;

    ret_val = read(0, &gc, 1);
    if (ret_val > 0)
    {
    return gc;
    }
    else
    {
    return EOF;
    }
    }

    so hatte ich es bis jetzt 😕

    PS: wie fügt man den code als fenster ein so wie du?



  • Ohne es mir genauer durchgelesen zu haben - ja, das sieht verwertbar aus.

    Moosi-M schrieb:

    PS: wie fügt man den code als fenster ein so wie du?

    sfds



  • danke 😃


Anmelden zum Antworten