Читать из трубы построчно в C

Как я могу отделить линии, которые идут от трубы. В трубе есть такой текст:

HALLO:500n
TEST:300N
ADAD
ADAWFFA
AFAGAGAEG

Я хочу, чтобы отделить линии от трубы, потому что я хочу сохранить значения в переменные.

вот мой код c:

#include <stdio.h>
#include <stdlib.h>

#define BUFFERSIZE    1

int main(int argc, char **argv){
    unsigned char     buffer[BUFFERSIZE];
    FILE                         *instream;
    int                            bytes_read=0;
    int                            buffer_size=0;


    buffer_size=sizeof(unsigned char)*BUFFERSIZE;
    /* open stdin for reading */
    instream=fopen("/dev/stdin","r");

    /* did it open? */
    if(instream!=NULL){
        /* read from stdin until it's end */
        while((bytes_read=fread(&buffer, buffer_size, 1, instream))==buffer_size){
            fprintf(stdout, "%c", buffer[0]);
        }
    }
    /* if any error occured, exit with an error message */
    else{
        fprintf(stderr, "ERROR opening stdin. aborting.n");
        exit(1);
    }

    return(0);
}

это правильный способ чтения из трубы для лучшей строки за строкой?

2 ответов


обычно это называется чтение из stdin. Программа не должна заботиться о том, является ли вход каналом, перенаправленным файлом или клавиатурой.

fread будет просто читать, пока буфер не заполнится. Используйте fgets для чтения строки.

также размер буфера должен быть достаточно большим, чтобы держать линию. Для небольших одноразовых программ, вы можете просто выбрать номер. Или есть стандартное имя BUFSIZ что дает вам довольно большая буфера. Насколько большой? Достаточно большой. Неужели? Возможно.

fgets будет копировать символ новой строки в строке, если строка не заполнится первой. Таким образом, вы можете проверить последний символ, чтобы сказать, была ли строка усечена или нет. При разумных затратах этого не произойдет. Но более надежный подход выделит больший буфер, скопирует частичную строку и вызовет fgets снова tp продолжает пытаться получить полную строку.

#include <stdio.h>

int main() {
    char buf[BUFSIZ];
    fgets(buf, sizeof buf, stdin);
    if (buf[strlen(buf)-1] == '\n') {
        // read full line
    } else {
        // line was truncated
    }
    return 0;
}

Это получает вас на полпути к защите от страшных буфера переполнение проблема. fgets не будет писать больше, чем размер, переданный ему. Другая половина, как упоминалось выше, делает что-то разумное с возможными частичными линиями, которые могут возникнуть из неожиданно длинных входных линий.


вот еще один вариант (я не совсем уверен, что это "правильно") - определяет количество байтов, считанных