C中的read()和fgets()之间的区别

时间:2011-06-02 20:35:22

标签: c fgets

我想从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));

    }
}

}

有人可以说明原因。我仍然觉得很难弄清楚

5 个答案:

答案 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库函数。