get家族:获取/输入
1、从标准输入缓冲区获取一个字符:getchar
int getchar(void);
返回值:
成功:获取到的字符的ASCII码值
失败:EOF
应用场合:
一般用来吸收scanf输入后留在缓冲区里的’\n’
例如:while(getchar() != ‘\n’);
2、从指定缓冲区中获取一个字符:getc和fgetc
int getc(FILE *stream);
int fgetc(FILE *stream);
参数:
FILE *stream:文件流指针
返回值:
成功:获取到的字符的ASCII码值
失败:EOF(也有可能是从文件末尾开始读取)
这两个函数都是从指定的文件中获取一个字符,但区别在哪?
getc是一个宏,fgetc是一个函数
思考:如果文件中没有数据,使用getc或fgetc去获取一个字符,结果会如何?
结果:不会阻塞,因为文件没有行缓冲机制,返回值为-1,因为定位相当于在文件末尾
3、从指定缓冲区中获取一个字符串:fgets和gets
char *fgets(char *s, int size, FILE *stream);
参数:
char *s:保存获取到的字符串
int size:要获取的字符串的长度(size最好多设置一位,因为fgets默认最后一个字节会给’\0’)
FILE *stream:文件流指针
返回值:
成功:获取到的字符串
失败:NULL
还有另一个函数gets也是从标准输入缓冲区中获取字符串
char *gets(char *s);
在man手册中对gets有这么一段说明:
BUGS
Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters
gets() will read, and because gets() will continue to store characters past the end of the buffer, it is
extremely dangerous to use. It has been used to break computer security. Use fgets() instead.
因为gets没有定义缓冲区的大小,容易造成缓冲区溢出,导致段错误,但在某些编译器中可以使用
但在linux下,编译时就会报警告:warning: the `gets’ function is dangerous and should not be used.
并且在强行执行时,在输入后会段错误:
gec@ubuntu:/mnt/hgfs/wh2302/3-文件IO/day3/code$ ./get
hello
buf=hello
Segmentation fault (core dumped)
put家族:输出
1、输出一个字符:putchar和puc和fputc
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
参数:
int c:要输出的字符,可以是ASCII码,也可以是字符数据
FILE *stream:文件流指针
返回值:
成功:输出字符的ASCII码值
失败:EOF
putchar:只能向标准输出缓冲区输出
putc和fputc可以向指定文件中输出,但如果没有正常关闭文件,是无法保存到文件中去
2、输出字符串:puts和fputs
int fputs(const char *s, FILE *stream);
int puts(const char *s);
参数:
const char *s:要输出的字符串
FILE *stream:文件流指针
区别:fputs可以向指定文件中输出,puts默认向标准输出缓冲区输出
返回值:
成功:非负数
失败:EOF