标准I/O
来源:互联网 发布:知乎 angelababy 编辑:程序博客网 时间:2024/06/06 18:30
学习笔记,小白可以相互学习,大佬看到能告诉咱理解不对的地方就好了。
标准I/O
流(stream):所有的I/O操作仅是简单的从程序移进或者移出,这种字节流,就定义为流。
标准I/O预定义了3个流,可以自动的为进程所用
stdin 0 标准输入
stdout 1 标准输出
stderr 2 标准出错输出
标准I/O提供的3种类型缓存:
1.全缓存:当缓冲区满了或者满足一定条件才会执行刷新操作。系统是通过调用malloc来获得所需要的缓冲区域。
2.行缓存:输入、输出遇到换行符‘\n’时,进行I/O操作。典型的行缓存,当流遇到一个终端时。
3.不带缓存:标准I/O库不带字符进行缓冲,如stderr。人机交互界面不可全缓存,标准出错绝对不可全缓存。
使用setbuf()和setvbuf()可以改变缓存类型,在任何时候可以用fflush强制刷新一个数据流。例:int flussh(FILE *fp);可强制刷新流,没被写入的数据都被传递至内核。
函数:
mode参数:(其实就是打开标准I/O流的方式)
r/rb 打开只读文件,文件必须存在
r+/r+b 打开可读写文件,文件必须存在
w/wb 打开只写文件,文件存在则清0,不存在则建立
w+/w+b/wb+ 打开可读写文件,文件存在则清0,不存在则建立
a/ab 以附加的方式打开只写文件,文件存在则写入的数据会被追加到文件末尾,不存在则建立
a+/a+b/ab+ 以附加的方式打开可读写文件,文件存在则写入的数据会被追加到文件末尾,不存在则建立
1.FILE *freopen(const char *restrict pathname,const char *restrict type,FILE* restrict fp)
//实现每隔一秒打印当前时间到文件fp2中去
#include<stdio.h>#include<unistd.h>#include<time.h>#include<string.h>int main(int argc,char *argv[]){ if(argc < 2) { fprintf(stderr,"usage:%s Filename.txt\n",argv[0]); return -1; } FILE *fp = fopen(argv[1],"a+"); if(NULL == fp) { perror("fopen"); return -1; } char b[256]; int i = 0; while(1)//此循环用来判断原来有多少行数据的 { if(NULL == fgets(b,sizeof(b),fp)) { break; } i++; } while(1) {/******************时间******************************/ char *wday[]={ "日", "一","二","三","四","五","六" }; time_t timep; struct tm *p; time(&timep); //printf("time():%d\n",timep); p = localtime(&timep); printf("%d------%d年%d月%d日",i,(1900+p->tm_year),(1+p->tm_mon),p->tm_mday); printf("星期%s,%d点%d分%d秒\n",wday[p->tm_wday],(p->tm_hour),p->tm_min,p->tm_sec); sleep(1); i++;/***********************************************/ freopen(argv[1],"a+",stdout);//输出重定向 }fclose(fp); return 0;}
//实现每隔一秒打印当前时间
#include <stdio.h#include <string.h>#include <stdlib.h>#include <strings.h>#include <time.h>int main(int argc, char *argv[]){if (argc < 2) {fprintf(stderr, "Usage: %s <filename>\n", argv[0]);return -1;}FILE *fp = NULL;if (NULL == (fp = fopen(argv[1], "a+"))) {perror("fopen");return -1;}int line = 0;char buf[100];while (NULL != fgets(buf, sizeof(buf), fp)) {if (buf[strlen(buf)-1] == '\n')line++;}time_t t;struct tm *tm;while (1) {time(&t);tm = localtime(&t);sprintf(buf, "%2d, %4d-%2d-%2d %2d:%2d:%2d\n", ++line, \tm->tm_year+1900, tm->tm_mon+1, \tm->tm_mday, tm->tm_hour, tm->tm_min, \tm->tm_sec);fputs(buf, fp);fflush(fp);sleep(1);}fclose(fp);return 0;}
2..FILE *open(const char *path,const char *mode)
打开一个流,成功返回FILE*类型的值,失败返回NULL
3.int fclose(FILE *stream)
关闭一个已经打开的流,成功返回0,失败返回EOF(Ctrl+D)(EOF也是文件结束返回标志),并设置errno
4.int fgetc(FILE *stream),int fputc(int c,FILE *stream)
每次读写一个字符
fgetc()成功为下一个字符,处于文件尾或者出错返回EOF
//实现copy
#include<stdio.h>int main(int argc,char *argv[]){ if(argc < 3) { printf("将filename1复制到filename2中\n"); fprintf(stderr,"usage: %s filename1 filename2\n",argv[0]); return -1; } FILE *fp = fopen(argv[1],"r+"); FILE *fp2 = fopen(argv[2],"w+"); if(NULL == fp) { perror("fopen"); return -1; } int ch; while(EOF != (ch = fgetc(fp))) { fputc(ch,fp2); } fclose(fp); return 0;}
5.char *fgets(char *s,int size,FILE *stream),int fputs(const char *s,FILE *stream)
每次读写一行
fgets()成功返回非负数,失败返回EOF
//实现copy
#include<stdio.h>int main(int argc,char *argv[]){ if(argc < 3) { printf("将filename1复制到filename2中\n"); fprintf(stderr,"usage: %s filename1 filename2\n",argv[0]); return -1; } FILE *fp = fopen(argv[1],"r+"); FILE *fp2 = fopen(argv[2],"w+"); if(NULL == fp) { perror("fopen"); return -1; } char ch[1024]; while(NULL != fgets(ch,sizeof(ch),fp)) { fputs(ch,fp2); } fclose(fp); return 0;}
6.size_t fread(void *ptr,size_t size,size_t 你们帮,FILE *stream)
size_t fwrite(void *ptr,size_t size,size_t 你们帮,FILE *stream)
两个函数的返回是读/写的对象数
//实现copy
#include<stdio.h>int main(int argc,char *argv[]){ if(argc < 3) { printf("将filename1复制到filename2中\n"); fprintf(stderr,"usage: %s filename1 filename2\n",argv[0]); return -1; } FILE *fp = fopen(argv[1],"r+"); FILE *fp2 = fopen(argv[2],"w+"); if(NULL == fp) { perror("fopen"); return -1; } int a; char ch[100]; while(1) { a = fread(ch,1,sizeof(ch),fp); if(a <= 0) { break; } fwrite(ch,1,a,fp2); } fclose(fp); return 0;}
7.int fseek(FILE *stream,long offset,int whence)
long offset是偏移的字节数,whence是相对的偏移位置,参数是:SEEK_SET/SEEK_CUR/SEEK_END,分别是文件头,当前位置,文件尾
//此代码是实现对图片的打码
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <strings.h>int main(int argc, char *argv[]){if (argc < 2) {fprintf(stderr, "Usage: %s <file.bmp>\n", argv[0]);return -1;}FILE *fp = NULL;if (NULL == (fp = fopen(argv[1], "r+"))) {perror("fopen");return -1;}fseek(fp, 54, SEEK_SET);char buf[100*3] = {0};int i;for (i = 0; i < 100; i++)fseek(fp, 300*3, SEEK_CUR);for (i = 0; i < 100; i++) {fseek(fp, 100*3, SEEK_CUR);fwrite(buf, sizeof(buf), 1, fp);fseek(fp, 100*3, SEEK_CUR);}fclose(fp);return 0;}
最后我看到几个不错的相关知识在这里分享下,下面是他们的地址:
http://blog.csdn.net/strongwangjiawei/article/details/7786085
http://blog.csdn.net/fulva/article/details/8112792
- Java 标准I/O
- 标准 C I/O
- 标准I/O库函数
- 标准I/O缓冲
- 标准I/O库
- 标准I/O库
- 标准I/O开发
- 标准I/O库
- 标准I/O限制
- 标准I/O
- 标准I/O库
- 标准I/O详解
- 标准I/O
- 标准I/O库
- 标准I/O缓冲
- C标准I/O
- 标准I/O库
- 标准I/O操作
- 回调函数
- Sophix移动热修复之在AndroidStudio项目集成SDK(一)
- HDU1016(dfs)
- 不再纠结前置++与后置++
- Qrcode二维码生成
- 标准I/O
- 51Nod 1475 建设国家
- pugixml使用
- html中 label里for属性和form属性
- Opencv图像变灰处理(纯C++,不依赖Opencv Manager)
- LIST、MAP、SET总结
- 练习4-1 编写函数strrindex(s,t),它返回字符串t在s中最右边出现的位置。如果s中不包含t,则返回-1。
- mac osx 下 homebrew安装
- 微信JS-SDK Demo