2016-12-08 5 views
1

Так у меня есть FIFO-файл, который я сделал с mkfifo() функции в терминале и я отправляю данные с: echo"12.5 123 5 -2.1" > rndfifoFIFO, получающие номера (код C)

Моя программа должна прочитать эти цифры и поместить их в массив так что я могу использовать их позже. В настоящее время мне удалось создать программу, которая читает эти числа и помещает их в массив символов, но я застрял и понятия не имею, как продолжить, чтобы любая помощь?

Код:
MSG_LEN определено в

int main(int argc, char **argv) { 
if(2 != argc) 
    exit(EXIT_FAILURE); 

int fd = open(argv[1], O_RDONLY); 
if(-1 == fd); 
    exit(EXIT_FAILURE); 

do { 
    char buf[MSG_LEN]; 
    int bytesRead; 

    if(-1 == (bytesRead = read(fd, buf,MSG_LEN))){ 
     perror("Reading from PIPE failed"); 
     exit(exit_failure); 
    } 
    if (0 == bytesRead) 
     break; 

    printf("Read number: %d\n", atoi(buf)); 
} while (true); 

close(fd); 
return 0; 
} 

решение для разделения чисел, которые я написал (спасибо Chintan)
(если есть какие-либо лучше те, пожалуйста, напишите их)

Также, что я могу сделать, чтобы остановить программу, если пип e отправляет что-то еще, а затем число?

char *deo; 
float tmp; 
deo = strtok(buf," "); 
while(deo != NULL){ 
    sscanf(deo,"%f",&tmp); 
    //tmp one number from buf(sent from FIFO) 
    deo = strtok(NULL," "); 
} 
+0

Пожалуйста исследуйте 'sscanf' или' strtok' – Chintan

+0

Спасибо, я думаю, что strtok поможет – Nikola

ответ

1

После прочтения сообщения FIFO, и поместил содержимое в массив символов, считать, что массив символов и разобрать цифры от него, или остановить программу, если есть что-то еще, то число. Для чтения чисел из массива символов используйте double strtod(const char *nptr, char **endptr) Чтобы узнать, как найти недопустимый символ в массиве символов, прочитайте первый пример, а затем обратитесь к ПРИМЕЧАНИЕ во втором (длинном) примере.

Попробуйте следующий короткий пример с разными строками:

char buffer[128] = "12.5 123 5 -2.1 text text 0.0 -15";

char buffer[128] = "text";

char buffer[128] = "1 2 39 3.45 0 17.3 0 10e2 78.33";

char buffer[128] = "12.5 123 5 -2.1"; 
char *beginPtr = buffer; 
char *endPtr = NULL; 
double current = 0; 

while(true) 
{ 
    // After strtod call, if parsing was successful, 
    // endPtr will point to the first character after 
    // parsed number. 
    // If no number is parsed, endPtr will not change. 
    current = strtod(beginPtr, &endPtr); 

    // If endPtr is unchanged from last iteration, 
    // strtod encountered some non-float character 
    // EOF for example 
    if(beginPtr == endPtr) { 
     break; 
    } 

    // Moving beginPtr 
    beginPtr = endPtr; 
    printf("%lf\n", current); 
} 

Долгий пример с получением среднего значения от номеров в сообщении FIFO. Если вам нужно поместить эти цифры в массиве, вот как (если вам нужно взять среднее, вы даже не нужно, чтобы поместить их в массив :))

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 
#include <errno.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 
#include <string.h> 

#define MAX_LEN (256) 
// cond should be TRUE if there is no error 
void CHECKERR(bool cond, char* msg); 
void printArray(double *array, int n); 

int main(int argc, char** argv) 
{ 
    // For errno 22, perror will print 'Invalid argument' 
    errno = 22; 
    CHECKERR(2 == argc, "Usage: ./2 pathToFifoFile\n"); 
    errno = 0; 

    int fileDesc = 0; 
    char buffer[MAX_LEN]; 
    char *beginPtr = NULL; 
    char *endPtr = NULL; 

    double *array = NULL;   
    double current = 0.0; 
    double sum = 0.0; 
    double avg = 0.0; 
    int count = 0; 

    fileDesc = open(argv[1], O_RDONLY); 
    CHECKERR(-1 != fileDesc, "Failed to open file.\n");  
    CHECKERR(-1 != read(fileDesc, buffer, sizeof buffer), "Failed to read file.\n"); 

    beginPtr = buffer; 
    while(true) 
    { 
     // Move the endPtr if parsing was successful 
     current = strtod(beginPtr, &endPtr); 

     // NOTE: echo "12.5 123 5 -2.1" > /tmp/rndfifo 
     // will put '\n' at the end of the string. 
     // If you have regular string, change the *endPtr != '\0' 
     if(beginPtr == endPtr && *endPtr != '\n') 
     { 
      printf("Further characters after float: %s\n", endPtr); 
      errno = 22;    
      CHECKERR(false, "FIFO contains non-float characters"); 
     } 

     if(beginPtr == endPtr) { 
      break; 
     } 
     // Moving beginPtr 
     beginPtr = endPtr; 

     sum += current; 
     count++;   
    } 

    // Print out average 
    avg = sum/count; 
    printf("Average: %.2lf\n", avg); 

    // At this point we know how much numbers are stored in buffer 
    array = (double*)malloc(count * sizeof(double)); 
    CHECKERR(NULL != array, "malloc() failed.\n"); 

    // Go trough buffer again to put numbers in array 
    beginPtr = buffer; 
    int i; 
    for(i = 0; i < count; i++) 
    { 
     current = strtod(beginPtr, &endPtr); 
     beginPtr = endPtr; 
     array[i] = current; 
    } 

    close(fileDesc); 
    printArray(array, count); 
    free(array); 

    return 0; 
} 

И наконец, PrintArray и CHECKERR реализации:

void printArray(double *array, int n) 
{ 
    int i; 
    for(i = 0; i < n; i++) { 
     printf("%.2lf ", array[i]); 
    } 
    putchar('\n'); 
} 


void CHECKERR(bool cond, char* msg) 
{ 
    if(!cond) 
    { 
     perror(msg); 
     exit(EXIT_FAILURE); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^