почему \ n в printf не выводит значение или старое значение массива char? - PullRequest
0 голосов
/ 03 октября 2018

Я пытался проверить именованный канал, когда столкнулся с этой ошибкой.У меня есть файл с именем client.c, который пишет в именованный канал.И у меня есть файл с именем server.c, который читает из именованного канала и печатает его значение.Похоже, что есть проблема с server.c

Код клиента.

//-------CLIENT-----------
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#define FIFO_FILE "MYFIFO"
int main()
{
    int fd, ch;
    char readbu[80];
    int write_byte;
    fd=open(FIFO_FILE,O_WRONLY);
    while(1)
    {
        printf("Enter choice \n1.Pepsi\n2.Coke\n3.Limca\n4.Maza\n");
        scanf("%d",&ch);
        switch(ch)
        {
            case 1: strcpy(readbu,"Pepsi\0");  
            write_byte=write(fd,readbu,sizeof(readbu));
            break;
            case 2: strcpy(readbu,"Coke\0");  
            write_byte=write(fd,readbu,sizeof(readbu));
            break;
            case 3: strcpy(readbu,"Limca\0");  
            write_byte=write(fd,readbu,sizeof(readbu));
            break;
            case 4: strcpy(readbu,"Maza\0");  
            write_byte=write(fd,readbu,sizeof(readbu));
            break;
            default:printf("Invalid");
            break;
        }
    }
    return 0;
}

Код сервера:

// Server code    
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#define FIFO_FILE "MYFIFO"
int main()
{
    int fd;
    char readbuf[80];
    char end[10];
    int to_end;
    int read_bytes;
    mknod(FIFO_FILE,S_IFIFO|0640,0);
    strcpy(end,"end");
    while(1)
    {
        fd=open(FIFO_FILE,O_RDONLY);
        read_bytes=read(fd,readbuf,sizeof(readbuf));
        readbuf[read_bytes]='\0';
        printf("Rec str = %s of len %d", readbuf,(int)strlen(readbuf));
        to_end=strcmp(readbuf,end);
        if(to_end==0)
        { close(fd);
            break;
        }`enter code here`
    }
    return 0;
}

На стороне сервера выше код не печатает вывод,

Если я изменю операторы printf на ниже, то я замечаю, что сначала итерация выводит пустую строку, а затем для другой итерации выводит старые значения.

printf("\nRec str = %s of len %d", readbuf,(int)strlen(readbuf));

Если я изменю операторы printf ниже, то я замечаю, что он печатает правильные значения.

printf("Rec str = %s of len %d\n", readbuf,(int)strlen(readbuf));

Я совершенно сбит с толку, как \ n имеет такое большое значение.

Я попытался проверить значение в readbuf с помощью gdb, и оно на самом деле содержит правильные значения.Пожалуйста, помогите мне понять трюк здесь.

1 Ответ

0 голосов
/ 03 октября 2018

Выходной буфер обычно не очищается до тех пор, пока он не будет заполнен, не будет вставлена ​​новая строка или явный вызов fflush( stdout ).

Если в начале вывода есть новая строка, он сбрасываетранее буферизованные данные, и буферизует следующие данные.

Следующее решит проблему:

printf("\nRec str = %s of len %d", readbuf,(int)strlen(readbuf));
fflush( stdout ) ;
...