言之者无罪,闻之者足以戒。 ——《诗序》
这两天总觉得文章之中只有一个颜色太过单调,所以我就换了一个编译器,以后文章中的颜色会丰富一点。
1、fprintf、printf、sprintf 行缓存函数
int fprintf(FILE *stream,"字符串格式")
fprintf()函数可以输出到文件中,也可以输出到显示器;printf()函数只能输出到显示器;
int sprintf(str *,"字符串格式") ;输出内容到一个字符串中
2、一个字符的读写函数 fgetc和fputc
int fgetc(FILE *fp)
功能:从文件中读取一个字符
参数:文件流(看见文件流就要注意文件流指针)
返回值:正确为读取的字符,到文件结尾或出错时返回EOF(-1)
int fputc(int c,FILE *fp)
功能:写一个字符到文件中
参数:第一个参数为要写的字符,第二个参数为文件流
返回值:成功则返回输入的字符,出错返回EOF(-1)
fputc是否为行缓存?
下面给出一段程序以更好的掌握内容:
#include <stdio.h>
int main(int argc,char *argv[])
{
FILE *fp;
int ret;
fp=fopen("./a.c","w+");
if(fp==NULL)
{
printf("open file a.c failure\n");
return -1;
}
printf("open file a.c sucess\n");
fputc('a',fp);
// fputc('\n',fp);
// fflush(fp);
// while(1);
rewind(fp);
ret=fgetc(fp);
printf("ret= %c\n",ret);
ret=fgetc(fp);
printf("ret= %d\n",ret);
fclose(fp);
return 0;
}
通过上面的程序我们可以知道fputc确实是有缓存的,但是不是行缓存。
注意:一般我们是先写然后再去读,但是如果写完之后直接读取那么读取的结果就是错误的,所以在写过之后读取之前我们需要把文件指针指向要开始读取的位置,这样才能得到正确的结果。也就是我们前面学过的fflush()函数和fseek()函数。
3、怎样判断返回出错的类型?
当返回出错时,我们怎样去判断是已经到达文件结尾,还是读错呢?
下面介绍几个函数用于判断:
1)、int feof(FILE *stream);
功能:判断是否已经到达文件结束
参数:文件流
返回值:到文件结束,返回为非0,不是则返回0
2)、int ferror(FILE *stream);
功能:判断是否读写错误
参数:文件流
返回值:是读写错误,返回为非0,不是则返回0
3)、void clearerr(FILE *stream);
功能:清除流错误
参数:文件流
下面给出程序巩固以上知识:
#include <stdio.h>
int main(int argc,char *argv[])
{
FILE *fp;
int ret;
fp=fopen("./a.c","w+");
if(fp==NULL)
{
printf("open file a.c failure\n");
return -1;
}
printf("open file a.c sucess\n");
fputc('a',fp);
rewind(fp);
ret=fgetc(fp);
printf("ret= %c\n",ret);
ret=fgetc(fp);
printf("ret= %d\n",ret);
printf("feof=%d,ferror=%d\n",feof(fp),ferror(fp));
clearerr(fp);
printf("clear error after:feof=%d,ferror=%d\n",feof(fp),ferror(fp));
fclose(fp);
return 0;
}
程序的运行结果也给大家截张图: