Linux中头文件路径:/usr/include/unistd.h
//标准文件描述符
/* Standard file descriptors. */
#define STDIN_FILENO 0 //标准输入文件描述符
#define STDOUT_FILENO 1 //标准输出文件描述符
#define STDERR_FILENO 2 //标准出错文件描述符
头文件路径:/usr/include/stdio.h
typedef关键字给数据类型取别名
typedef struct _IO_FILE FILE; // FILE 等价于 struct _IO_FILE
/* Standard streams. */
extern struct _IO_FILE *stdin; //标准输入的文件指针
extern struct _IO_FILE *stdout; //标准输出的文件指针
extern struct _IO_FILE *stderr; //标准出错的文件指针
等价于
extern FILE *stdin; --> 对应文件描述符0
extern FILE *stdout; --> 对应文件描述符1
extern FILE *stderr; --> 对应文件描述符2
/* C89/C99 say they're macros. Make them happy. */
#define stdin stdin --> 前面stdin是宏定义 后面stdin是变量 (好处:这样做可以让文件指针变得跟文件描述符一样,都是宏定义)
#define stdout stdout
#define stderr stderr
总结
文件描述符 文件指针
标准输入 STDIN_FILENO stdin
标准输出 STDOUT_FILENO stdout
标准出错 STDERR_FILENO stderr
printf(),sprintf()和fprintf()函数的用法区别
printf()的 默认对象是标准输出,标准输出具有缓冲区,是一个缓冲区函数,要有特定的条件才能输出,标准出错缓冲区会立刻输出缓冲区上的内容
sprintf()保存一个字符到缓冲区中,拼接字符串
fprintf() 可以修改printf()的输出对象
#include <stdio.h>
int fprintf(FILE *stream, const char *format, ...);
参数:
stream:文件指针
format:输出的内容
printf("hello"); --> 因为printf默认对象是标准输出,所以这句话含义是把"hello"放在标准输出缓冲区中。
等价于
fprintf(stdout,"hello"); --> 指定把"hello"放在标准输出缓冲区中
fprintf(stderr,"hello"); --->标准出错缓冲区会立刻输出内容
getchar(),getc(),
getchar() --> 从标准输入缓冲区中获取一个字符 作用:清空缓冲区
#include <stdio.h>
int getchar(void);
参数:无
返回值:
成功:获取到的字符
失败:EOF
每次scanf()之后,都要跟这句话
while(getchar() != '\n');
就可以清空缓冲区。
getc() --> 可以去任意一个文件指针中获取一个字符
#include <stdio.h>
int getc(FILE *stream);
参数:
stream:需要获取字符的文件指针
返回值:
成功:获取到的字符
失败:EOF
fgetc() 等价于 getc
#include <stdio.h>
int fgetc(FILE *stream);
参数:
stream:需要获取字符的文件指针
返回值:
成功:获取到的字符
失败:EOF
下面这个函数用的多
fgets() ---> 获取一个字符串到一个缓冲区中 --> man 3 fgets
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
参数:
s: 缓冲区
size: 最多获取的字符个数
stream: 文件指针
返回值:
成功:第一个参数s
失败:NULL