三种不同类型的I/O:
(1)每次一个字符的I/O。一次读或者写一个字符,如果流时带缓冲的,则标准I/O函数处理所有 缓冲。
(2)每次一行的I/O,每行都以换行符终止。
(3)直接I/O
1.输入函数
#include <stdio.h>
int getc(FILE *stream);
int fgetc(FILE *stream);
//steam为要从中读取字符的文件流,该函数执行成功后,将返回所读取的字符。,出错返回EOF。
int getchar(void);
//该函数执行成功后,将返回所读取的字符。,出错返回EOF。
example:
#include <stdio.h> //引入标准输入输出库
int main( ) {
char ch;
printf ("Input a character: "); //输入提示信息
ch = getc(stdin); // 从标准输入控制台中读取字符
printf ("The character input was: '%c'\n", ch); // 输出字符
}
运行后的截图:
Tips:两个都是用来从stream中取得一个字符的,区别在于调用getc函数时所用的参数stream不能是有副作用的表达式(稍后解释),而fgetc函数则可以,也就是说,getc可以被当作宏来调用,而fgetc只能作为函数来调用。 一般来说,调用宏比调用函数耗费的时间少。所以fgetc是一个函数
getc是一个宏 一般来说宏产生较大的代码,但是避免了函数调用的堆栈操作,所以速度会比快。
有副作用的表达式,指的是表达式执行后,会改变表达式中某些变量的值
由于以上三个函数当遇到出错或者返回文件尾端的时候都返回同样的值,我们以下两种函数区分:
#include <stdio.h>
int ferror(FILE *fp); //stream为文件指针,若文件流出错则返回非0,否则返回0。
int feof(FILE *fp);//stream为文件指针,当设置了与流关联的文件结束标识符时,该函数返回一个非零值,否则返回零
在大多数实现中,为每个流在FILE对象中维护了两个标志:
- 出错标志
- 文件结束标志
调用clearerr清除这两个标志:
#include <stdio.h>
void clearerr(FILE *stream);
//stream为文件流指针。
从流中读取数据后,可以调用ungetc将字符在压回流中
#include<stdio.h>
int ungetc(char c, FILE *stream);
//c为要退回的字符,stream为要退回的输入流。若该函数执行成功,返回非零值;否则,返回0。
example:
#include <stdio.h>
int main()
{
FILE *fp;
int c;
char buffer[256];
fp=fopen("test.txt","r");
if(fp==NULL)
{
perror("error when open file");
return (-1);
}
while(!feof(fp))
{
c=getc(fp);
if(c == '!') ungetc('+',fp);
else ungetc(c,fp);
fgets(buffer,256,fp);
fputs(buffer,stdout);
}
return 0;
}
文本文件的内容为:
this is runoob
!c standard library
!library functions and macros
运行后输出为
TIPS:
(1)压送回流中的字符以后又可以从流中读出,但读出字符的顺序于压送回的顺序相反
(2)回送的字符,不一定必须是上一次读到的字符。不能回送EOF。
2.输出函数
上面对应的三个输入函数,都对应三个输出函数
#include <stdio.h>
int putc(int ch, FILE *stream);
//参数ch表示要输入的位置,参数stream为要输入的流。若正确,返回输入的的字符,否则返回EOF。
int fputc(int ch, FILE * stream);
//fputc 会将参数c 转为unsigned char 后写入参数stream 指定的文件中.fputc()会返回写入成功的字符, 即参数c. 若返回EOF 则代表写入失败.
int putchar (int ch);
//ch为要输出的字符。输出成功,返回该字符的ASCII码值,否则返回EOF。
上内容来源于网络,仅作本人学习笔记使用,关于本书请参考APUE。