Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中read()和fgets()的区别_C_Fgets - Fatal编程技术网

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

C中read()和fgets()的区别,c,fgets,C,Fgets,我想从标准数据流中读取数据。使用read()或fgets()从stdin流中读取有什么区别吗 我附上以下两段带有fgets和read的代码。 有了fgets,我可以使用java程序轻松地编写和读取c程序。 读写时,我的java程序挂起,等待C程序的输出,而C程序没有输出 我只是在读一行用buf写的,并在上面加了一个 Java程序能够与以下使用FGET和puts的程序进行对话 #include <stdio.h> #include <string.h> #define SI

我想从标准数据流中读取数据。使用read()或fgets()从stdin流中读取有什么区别吗

我附上以下两段带有fgets和read的代码。 有了fgets,我可以使用java程序轻松地编写和读取c程序。 读写时,我的java程序挂起,等待C程序的输出,而C程序没有输出

我只是在读一行用buf写的,并在上面加了一个

Java程序能够与以下使用FGET和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);
}
}

有人能说出原因吗。我仍然觉得很难弄明白

  • fgets
    是一个函数,
    read
    是一个系统调用
  • fgets
    是标准C,
    read
    不是
  • fgets
    是标准缓冲区,
    read
    不是
  • fgets
    可用于
    文件*
    read
    可用于文件描述符
  • fgets
    读取直到换行,
    read
    读取您告诉它的内容

需要更多吗?

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

这两个函数没有任何共同之处。read是POSIX系统调用,它从文件句柄读取。FGET是从一个文件中读取的C库函数*./P>< P>有一个重要的选择(<代码> Frad ),它有点在中间,所以这个问题应该被分成两个部分,并且这两个问题已经得到了很好的回答: 两者的区别是什么

两者的区别是什么

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

\include
#include <stdio.h>
char    fgets (char * restrict str, int size, FILE * restrict stream)
char fgets(char*restrict str,int size,FILE*restrict stream)
fgets()函数从给定流中读取的字符数最多比大小指定的字符数少一个,并将其存储在字符串str中。当发现换行符、文件结尾或错误时,读取将停止

参考资料:

#include <unistd.h>
ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);
#包括
分配表(整数字段、空*buf、大小字节、偏移量);
read()函数将尝试从与打开的文件描述符fildes相关联的文件中读取nbyte字节到buf指向的缓冲区中。未指定同一管道、FIFO或终端设备上多个并发读取的行为


参考资料:

@DarkDust他只有7个问题,还算不错:-)@cnicutar:考虑到他的两个问题是半年前提出的,另一个也是3月或4月提出的,这很糟糕。嘿,很抱歉,我不知道接受答案的机制。我会为opengroup做+1@Andrei(而不是cplusplus)。。。但您可以在链接中使用而不是POSIX.1-2004;)更新了参考链接@pmg。谢谢你纠正我的回答。@Andrei。。。基于上述程序,我无法判断是否使用fgets读取标准数据或读取标准数据。类似地,puts(buf)帮助我通过外部程序从标准输出读取数据,写入(标准输出,buf)也是如此。但是读写速度很慢,然后使用外部java程序执行puts和puts GET操作……您能帮助清除吗this@ssD,如何从java调用c程序?@Andrei我正在使用Process.getruntime()然后使用BufferedWriter和BufferedReader在外部c程序中读写
fgets()
向缓冲区追加一个空字节(这给了strcat()一个起点);
read()
没有。
#include <unistd.h>
ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);