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
返回的那样。 stdin
, stdout
和stderr
已经为您的程序定义,因此您可以直接使用它们,而不是自己打开或声明它们。
例如,您可以从标准输入中读取:
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是正确的符号。