C中的fgets()函数

我知道每个人都告诉我使用fgets而不是因为缓冲区溢出而得到的。 但是,我对fgets()的第三个参数感到有点困惑。 据我了解,fgets依赖于:

 char * fgets ( char * str, int num, FILE * stream ); 

char* str是我的输入存储位置的ptr。

num是要读取的最大字符数。

但什么是FILE *stream ? 如果我只是提示用户输入字符串(如句子),我应该输入“ stdin ”吗?

我应该在main()附近的顶部键入FILE *stdin吗?

你是对的。 stream是指向FILE结构的指针,就像从fopen返回的那样。 stdinstdoutstderr已经为您的程序定义,因此您可以直接使用它们,而不是自己打开或声明它们。

例如,您可以从标准输入中读取:

 fgets(buffer, 10, stdin); 

或者从特定文件中:

 FILE *f = fopen("filename.txt", "r"); fgets(buffer, 10, f); 

是的,你应该只使用stdin 。 这是一个预定义的FILE * ,它从程序的标准输入读取。 如果您的文件顶部有#include fgets需要它),那么它应该已经定义了。

从广义上讲,有两种方法可以与C中的文件进行通信。一种是使用低级操作系统相关的系统调用,例如open()read()write()等,它们与文件描述符一起使用。 另一个是使用FILE结构,这些结构用于C库函数,如fread()fwrite()等,包括上面提到的那个。

与UNIX哲学一样,一切都是文件。 因此,即使标准输入( stdin )也被视为指向FILE结构的指针。

tl; dr是的,你应该在调用fgets()使用stdin for FILE* stream

FILE是标准的C文件。 是的,如果您想从标准输入读取,则stdin是正确的符号。