Почему \n в printf не выводит значение или старое значение массива char?
Я пытался проверить именованный канал, когда я столкнулся с этой ошибкой. У меня есть файл с именем 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 ответ
Выходной буфер обычно не очищается до тех пор, пока он не будет заполнен, не будет вставлена новая строка или явный fflush( stdout )
вызов.
Когда в начале вывода есть новая строка, она очищает ранее буферизованные данные и буферизует следующие данные.
Следующее решит проблему:
printf("\nRec str = %s of len %d", readbuf,(int)strlen(readbuf));
fflush( stdout ) ;