I want to read from a stdin stream. Is there any difference in using read() or fgets() to read from the stdin stream.
I am attaching the following two pieces of code with fgets and read. With fgets I can use a java program to write and read from the c program easily. With read and write my java program hangs waiting for the output from C program which does not come.
I am just reading a line keeping it in buf and appending A to it.
Java program is able to talk to the following program which works with fgets and puts.
#include <stdio.h>
#include <string.h>
#define SIZE 200000
main()
{
int rc;
int df;
int i;
char buf[SIZE];
for(i=0;i<=120000;i++) {
memset(buf,'\0',SIZE);
if(!fgets(buf,SIZE-1,stdin))
continue;
strcat(buf,"A_A_A_A_A_A_A");
puts(buf);
}
}
but not with read() and write()
main()
{
int rc;
int df;
int i;
char buf[32768];
rc = fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
//rc = fcntl(fileno(stdout), F_SETFL, O_NONBLOCK);
FILE *fp;
for (;;)
{
int rc=-1;
memset(buf,'\0',32768);
//rc = fread(buf,5, 1, stdin);
rc = read(fileno(stdin),buf,32768);
if (rc > 0)
{
strcat(buf,"B_B_B_B_B_B_B_B_B");
write(fileno(stdout),buf,strlen(buf));
}
}
}
Could some one tell the reason. I am still finding it hard to figure out
There is an important alternative (
fread
) which sits somewhat in the middle, so the question should really be broken into two parts - and both are already well answered in SO:What is the difference between
fread
andread
?What is the difference between
fgets
andfread
?Quick rule of thumb: use
fgets
if you intend to read textual data line by line, usefread
elsewhere.The two functions have nothing in common. read is a POSIX system call, which reads from a file handle. fgets is C library function that reads from a FILE *.
One (
read
) attempts to read the specified number of bytes, whereas the other (fgets
) attempts to read one line and will stop at a newline.fgets
is a function,read
is a system callfgets
is standard C,read
is notfgets
is stdio buffered,read
is notfgets
works with aFILE *
,read
works with a file descriptorfgets
reads until newline,read
reads how much you tell it toNeed more ?
The fgets() function reads at most one less than the number of characters specified by size from the given stream and stores them in the string str. Reading stops when a newline character is found, at end-of-file or error.
Reference: fgets()
The read() function shall attempt to read nbyte bytes from the file associated with the open file descriptor, fildes, into the buffer pointed to by buf. The behavior of multiple concurrent reads on the same pipe, FIFO, or terminal device is unspecified.
Reference: read()