2017-09-24 4 views
0

Ich versuche, einen C-Code (läuft auf einem Ubuntu Linux OS) zu schreiben, die von stdin kontinuierlich liest und jedes Mal variierende Länge von Bytes empfängt. Er muss in 15 Byte langen Arrays an stdout zurücksenden, wenn der Empfangspuffer jedes Mal 15 erreicht oder überschreitet.lesen() für das Lesen von Stream von Stdin

Draft-Code

#include <stdio.h> 
#include <unistd.h> 

int main() 
{ 
    char buff[100]; 

    // Round 1 
    read(STDIN_FILENO, buff, 15); 
    printf("Part 1:%s", buff); 

    // Round 2 
    read(STDIN_FILENO, buff, 15); 
    printf("Part 2:%s", buff); 

    return 0; 
} 

Um ein Beispiel mit einem Szenario zu geben. Wir erhalten 30 Bytes, in 3 Batches und 10 Bytes für jedes Mal. Ich habe 3 Echobefehle verwendet, um dies im nachstehenden Beispielszenario darzustellen.

Außerdem werden die erwartete Ausgabe und die tatsächliche Ausgabe des aktuellen Entwurfscodes hinzugefügt. Irgendein Kommentar oder Vorschlag, um die erwartete Ausgabe zu haben (vielleicht eine andere Funktion als Lesen und Drucken?), Würde geschätzt werden.

Szenario

Terminal 1:

mkfifo /tmp/MyPipe 
tail -f /tmp/MyPipe | ./StreamProcess 

Terminal 2:

echo -ne '1234567890' >> /tmp/MyPipe 
echo -ne 'abcdefghij' >> /tmp/MyPipe 
echo -ne 'qwertyuiop' >> /tmp/MyPipe 

Erwartete Ausgabe auf Terminal 1

Nach dem 1. Echo: Nichts g ist

gedruckt

nach 2.em Echo:

Part 1:1234567890abcde 

Nach 3.em Echo:

Part 1:1234567890abcdePart 2:fghijqwertyuiop 

Stromausgang (mit Entwurf-Code) auf Terminal 1

Nach dem 1. Echo: Nichts wird gedruckt

Nach dem 2. Echo:

Part 1:1234567890s·  s·Part 2:abcdefghijs· s· 

nach dem 3. Echo: (nur die $ prompt gedruckt wird)

Part 1:1234567890s·  s·Part 2:abcdefghijs· s·$ 
+0

Dies ist vom Betriebssystem (Sie wahrscheinlich verwenden POSIX oder Linux) zu überprüfen. Lies über [poll (2)] (http://man7.org/linux/man-pages/man2/poll.2.html) und bearbeite deine Frage, um sie zu verbessern (zumindest indem du mitteilst, welches Betriebssystem du gerade programmierst) –

+2

1) 'char buff [100];' buff wird nicht initialisiert 2) 'read (STDIN_FILENO, buff, 15);' read gibt einen Wert zurück. Benutze es! 3) 'printf (" Teil 1:% s ", buff);' buff ist nicht notwendigerweise nullterminiert. Außerdem: füge ein '\ n' zur Formatzeichenfolge hinzu. ' – wildplasser

+0

@wildplasser Wird der Puffer nicht vorinitialisiert, es sei denn, er befindet sich im globalen Gültigkeitsbereich? Ich verstehe, dass Null-Terminatoren platziert werden müssen, aber der Puffer muss nicht auf Null gesetzt werden. – synchronizer

Antwort

0

angesichts der in der Frage genannten Kriterien, wird der folgende Code, um die gewünschte Operation auszuführen.

Bearbeiten: Kommentare zu Frage eingefügt.

Edit: hat Fehler

#include <stdio.h> // printf(), STDIN_FILENO. perror() 
#include <unistd.h> // read(), exit(), EXIT_FAILURE 

#define MAX_READ_LEN 15 

int main(void) 
{ 
    char buff[ MAX_READ_LEN+1 ]; 
    int partNum = 0; 

    while(1) 
    { 
     // Round 1 
     ssize_t bytesRead = read(STDIN_FILENO, buff, MAX_READ_LEN); 

     if(0 > bytesRead) 
     { 
      perror("read failed"); 
      exit(EXIT_FAILURE); 
     } 

     // implied else, read successful 

     buff[ bytesRead ] = '\0'; 
     partNum++; 
     printf("Part %d:%s\n", partNum, buff); 
    } 

    return 0; 
} // end function: main 
+0

Danke für Ihre Antwort. Ich habe "#include " nach oben hinzugefügt. Ausgang: Teil 1: 1234567890 Teil 2: abcdefghij Teil 3: qwertyuiop –

+0

@JimRaynor, warum diese Aussage hinzu: '# include '? Nichts in meiner Antwort oder in Ihrem geposteten Code benötigt irgendetwas aus dieser Header-Datei. – user3629249