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

ssD*_*ssD 9 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);
}
Run Code Online (Sandbox Code Playgroud)

}

但没有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));

    }
}
Run Code Online (Sandbox Code Playgroud)

}

有人可以说出原因.我仍然觉得很难弄明白

cni*_*tar 23

  • fgets是一个函数,read是一个系统调用
  • fgets是标准C,read不是
  • fgets是stdio缓冲,read不是
  • fgets使用a FILE *,read使用文件描述符
  • fgets读到新行,read读取你告诉它多少

需要更多 ?

  • `fgets()`在缓冲区附加一个空字节(它给`strcat()`一个起始位置); `read()`没有. (3认同)

leo*_*loy 6

有一个重要的替代方案(fread)位于中间,所以问题应该分为两部分 - 两者都已在SO中得到很好的回答:

freadread之间有什么区别?

fgetsfread之间有什么区别?

快速经验法则:fgets如果您打算逐行阅读文本数据,请fread在其他地方使用.