流操作
字符的输入输出
字符的输入
#include <stdio.h> int fgetc(FILE *stream); int getc(FILE *stream); //宏 int getchar(void);
成功时返回读取的字符;若到文件末尾或出错时返回EOF
getchar()等同于fgetc(stdin)
getc和fgetc区别是一个是宏一个是函数
建议使用fgetc()
示例代码:
#include <stdio.h> int main(){ char ch; ch = fgetc(stdin); printf("read char:%c\n",ch); return 0; }
如果是从文件读入就是:
#include <stdio.h> int main(){ char ch; FILE *fp; fp = fopen("1.txt","r"); if(fp != NULL){ ch = fgetc(fp); printf("read char:%c\n",ch); }else{ perror("open"); } return 0; }
字符的输出
#include <stdio.h> int fputc(int c, FILE *stream); int putc(int c, FILE *stream); int putchar(int c);
成功时返回写入的字符;出错时返回EOF
putchar©等同于fputc(c, stdout)
相关示例代码在/io/1.stand_io/2.open_close
思考题:
如何利用fgetc / fputc实现文件的复制?
通过命令行参数传递源文件和目标文件名
通过fgetc返回值判断是否读到文件末尾
示例代码在io/1.stand_io/2.open_close/fgetc_fputc_copy.c
补充一个命令:diff 1.txt 2.txt可以对比两个文件的差异。
行输入输出
字符的输入
#include <stdio.h> char *gets(char *s);//不要用!!!!! char *fgets(char *s, int size, FILE *stream);
成功时返回s,到文件末尾或出错时返回NULL
gets不推荐使用,容易造成缓冲区溢出已经被废除!
遇到’\n’或已输入size-1个字符时返回,总是包含’\0’
字符的输出
#include <stdio.h> int puts(const char *s); int fputs(const char *s, FILE *stream);
成功时返回输出的字符个数;出错时返回EOF
puts将缓冲区s中的字符串输出到stdout,并追加’\n’
fputs将缓冲区s中的字符串输出到stream,不追加 ‘\n’
对象的输入输出
#include <stdio.h> size_t fread(void *ptr, size_t size, size_t n, FILE *fp); size_t fwrite(const void *ptr, size_t size, size_t n, FILE *fp);
成功返回读写的对象个数;出错时返回EOF
既可以读写文本文件,也可以读写数据文件
效率高
相关的操作在/io/1.stand_io/2.open_close
刷新流和定位
刷新流
#include <stdio.h> int fflush(FILE *fp);
成功时返回0;出错时返回EOF
将流缓冲区中的数据写入实际的文件
Linux下只能刷新输出缓冲区,输入缓冲区丢弃
示例代码
#include <stdio.h> int main(){ int i = 0; for(i = 0; i < 100; ++i){ printf("a"); fflush(stdout); } while(1); return 0; }
定位流
看下图,当进行写操作的时候,我们的指针会不断的往后走,如果我们想要回到b的位置进行重写,就是流定位。
#include <stdio.h> long ftell(FILE *stream); long fseek(FILE *stream, long offset, int whence); void rewind(FILE *stream);//回到文件头
ftell() 成功时返回流的当前读写位置,出错时返回EOF
fseek()定位一个流,成功时返回0,出错时返回EOF
whence参数:SEEK_SET/SEEK_CUR/SEEK_END
示例程序:
#include <stdio.h> int main(){ FILE *fp; int st; char buf[16]; fp = fopen("1.txt","a+"); if(fp){ st = ftell(fp); printf("st:%d\n", st); fputs("abcd",fp); st = ftell(fp); printf("st:%d\n", st); //fseek(fp, 1, SEEK_SET); rewind(fp); fgets(buf, 5, fp); printf("buf:%s\n",buf); } return 0; }
判断流是否出错和结束
#include <stdio.h> int ferror(FILE *stream); int feof(FILE *stream);
ferror()返回1表示流出错;否则返回0
feof()返回1表示文件已到末尾;否则返回0
格式化输出和输入
格式化输出
#include <stdio.h> int printf(const char *fmt, …); int fprintf(FILE *stream, const char *fmt, …); int sprintf(char *s, const char *fmt, …);
成功时返回输出的字符个数;出错时返回EOF
使用起来很方便,强烈推荐!
示例代码详见:/io/1.stand_io/2.open_close/sprintf.c
格式化输入
int fscanf(FILE *stream, const char *format, ...); int sscanf(const char *str, const char *format, ...);
示例代码详见:/io/1.stand_io/2.open_close/scanf.c
思考和练习
每隔1秒向文件test.txt中写入当前系统时间,格式如下:
1, 2014-10-15 15:16:42 2, 2014-10-15 15:16:43
该程序无限循环,直到按Ctrl-C中断程序
提示:
time()用来获取系统时间(秒数)
localtime()将系统时间转换成本地时间
sleep()实现程序睡眠
示例代码:/io/1.stand_io/2.open_close/demo.c
写在最后
文件IO没特别多的东西,今天已经过了一大半了,明天我就会更新完,我尽量一天一更,大家和我一起变强呀!最后三连即可提高学习效率!!!
另外我在更新的就是算法笔记的一些例题笔记,这个系列是用于提高我的算法能力,如果有兴趣对算法领域感兴趣找不到合适的入门文章也可以追更,如果我更新的太慢了请大家点赞收藏,一键三连才能更有更新的动力呀0.0