这两行代码有什么区别?

时间:2017-02-09 01:39:35

标签: c printf file-handling scanf

fscanf(file,"%d %d",&int_var1,&int_var_2); `
fscanf(stdin,"%d %d",&int_var1,&int_var_2); 

请给我一个详细的解释。在fprintf()和fscanf()中使用stdin和stdout是什么?

3 个答案:

答案 0 :(得分:1)

fscanf(file, ...)从打开的文件file中读取。

fscanf(stdin, ...)从"标准输入中读取" (通常是你的键盘)。请注意,标准输入实际上并不是一个文件,但无论如何它都被视为一个文件。

答案 1 :(得分:0)

我想你问为什么scanf(....)fscanf(stdin,....)存在,因为他们做同样的事情

答案是使用fxxxx版本允许我编写独立于文件的代码。即

void Foo(FILE * f)
{
   fscanf(f,....);
   fprintf(f,....)
....
}

现在我可以Foo(stdin)Foo(file)

显然那不是问题。所以这是实际问题的答案

fscanf(file,"%d %d",&int_var1,&int_var_2); 

说 - 从FILE *指针file

指向的文件中读取字符
fscanf(stdin,"%d %d",&int_var1,&int_var_2); 

说 - 从FILE *指针stdin

指向的文件中读取字符

您必须使用file

自己制作fopen

stdin已存在(在stdio.h中定义)并连接到用户输入终端

答案 2 :(得分:0)

这样看......

全局变量stdinstdoutstderr都定义为

extern FILE *stdin, *stderr, *stdout;

它们是由shell打开的文件,用于启动程序,并在您输入main时始终存在。

fxxxx函数的语法糖版本(fscanf,fprintf等)缺少前导“f”(scanf,printf等)。这些只有一个默认的第一个参数(scanf使用stdin,printf使用stdout)。

scanf可以写为fscanf

的包装

这里有一些非常粗糙的伪代码

int scanf(const char *format, ...)
{
    ... // VA args stuff
    int result = fscanf(stdin, format, ...);
    ... // More VA args stuff
    return result;
}

但您需要使用fprintf打印到错误输出。