我想从stdin流中读取。使用read()或fgets()从stdin流中读取是否有任何区别。
我使用fgets附加以下两段代码并阅读。 使用fgets,我可以使用java程序轻松地编写和读取c程序。 通过读写,我的java程序会挂起来等待来自C程序的输出。
我正在读一条线,将它保持在buf中并将A附加到它上面。
Java程序能够与以下与fgets和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);
}
}
但不是read()和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));
}
}
}
有人可以说明原因。我仍然觉得很难弄清楚
答案 0 :(得分:22)
fgets
是一个函数,read
是系统调用fgets
是标准C,read
不是fgets
是stdio缓冲的,read
不是fgets
适用于FILE *
,read
适用于文件描述符fgets
读取直到换行符,read
读取您告诉它的数量需要更多?
答案 1 :(得分:6)
有一个重要的替代方案(fread
)位于中间位置,因此问题应该分为两部分 - 两者都已在SO中得到很好的回答:
fread
and read
之间有什么区别?
fgets
and fread
之间有什么区别?
快速经验法则:如果您打算逐行阅读文字数据,请使用fgets
,在其他位置使用fread
。
答案 2 :(得分:2)
#include <stdio.h>
char fgets (char * restrict str, int size, FILE * restrict stream)
fgets()函数最多读取一个小于给定流中size指定的字符数,并将它们存储在字符串str中。在找到换行符时,在文件结尾或错误时停止读取。
参考: fgets()
#include <unistd.h>
ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);
read()函数将尝试从与打开文件描述符相关联的文件中读取nbyte字节,fildes,进入buf指向的缓冲区。未指定同一管道,FIFO或终端设备上的多个并发读取的行为。
参考: read()
答案 3 :(得分:0)
一个(read
)尝试读取指定的字节数,而另一个(fgets
)尝试读取一行并停止换行。
答案 4 :(得分:0)
这两个功能没有任何共同之处。 read是一个POSIX系统调用,它从文件句柄中读取。 fgets是从库文件中读取的C库函数。