11

我想从标准输入流中读取。使用 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));

    }
}

}

有人能说出原因吗。我仍然很难弄清楚

4

5 回答 5

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

需要更多 ?

于 2011-06-02T20:37:33.097 回答
8

有一个重要的替代方案fread

fread和 和read有什么不一样?

fgets和 和fread有什么不一样?

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

于 2011-06-02T20:41:10.817 回答
2
#include <stdio.h>
char    fgets (char * restrict str, int size, FILE * restrict stream)

fgets()函数最多从给定流中读取比 size 指定的字符数少 1 的字符,并将它们存储在字符串 str 中。当发现换行符、文件结尾或错误时,读取停止。

参考:fgets()

#include <unistd.h>
ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);

read()函数应尝试从与打开的文件描述符 fildes 关联的文件中读取 nbyte 字节到由 buf 指向的缓冲区中。未指定同一管道、FIFO 或终端设备上的多个并发读取的行为。

参考:读()

于 2011-06-02T20:44:51.673 回答
0

一个 ( read) 尝试读取指定数量的字节,而另一个 ( fgets) 尝试读取一行并将在换行处停止。

于 2011-06-02T20:38:03.750 回答
0

这两个函数没有任何共同之处。read 是一个 POSIX 系统调用,它从文件句柄中读取。fgets 是从 FILE * 读取的 C 库函数。

于 2011-06-02T20:40:52.987 回答