标准i/o的常用apti解析:
文件流:
FILE *fopen(const char *path,const char *mode)
第一个参数:是全路径,即你需要打开的文件的路径;第二个参数是打开方式,
诸如"r","w","a"等多种打开方式,自己可以查一下;
该函数是将文件流和文件相关联的的函数,也是对文件操作的第一步(当然还有
其他api也可以实现相等的功能)。
FILE *freopen(const char *path,const char *mode,FILE *stream);
第一个参数是全路径,第二个参数打开方式(同上),第三个参数需要打开的文件流
对文件的操作:
读写操作:
读字写符i/o
读字符:int getc(FILE *stream);其中的参数可以从stream对应的文件中读入
一个字符,因而可以有getc(stdin)
int fgetc(FILE *strem);作用筒上
int getchar(void);
写字符:int putc(int c,FILE *stream);第一个参数,是需要输入的字符,第二
是关联需要写入的文件流。
int fputc(intc,FILE *stream);同上
int putchar(int c);
通过上面这两个函数可以实现linux中shell的cat命令:也可以实现cp命令,源码
如下:
#include<stdio.h>
3 #include<stdlib.h>
4 int main(int argc,char *argv[]){
5 FILE *fp=NULL;
6 char ch;
7 fp=fopen(argv[1],"r");
8 if(!fp){
9 printf("cannot open the file:\n");
10 return 0;
11 }
12 else {
13 ch=fgetc(fp);
14 while(ch != EOF){
15 printf("%c",ch);
16 ch=fgetc(fp);
17 }
18 fclose(fp);
19 return 0;
20 }
21
22
23 }
行i/o;
fgets和gets的解析:
fgets原型是:char *fgets(char *s,int size,FILE *fp);
第一个参数是在程序中需要定义的缓冲空间;第二个参数是需要从fp流关联的文
件中读出的个数减一(size-1);第三个参数是和文件关联的流。
例如:
char s[100];
fgets(s,10,stdin); //表示在执行时从键盘输入9个字符
对于这个函数有几种情况;
1,输入时小于9个字符,如:输入a;那么sizeof(s)==2,这里解释下
,因为通过fgets()这个函数输入字符串时,如果小于指定字符的话,会在将a读
出后,在其后加上\n和\0;
2当在输入的字符大于9时,fgets()会截断9个字符,并在其后添加
\0,sizeof(s)==9;
gets()函数原型是 char*gets(char *s);
其参数表示需要输入的空空间的首地址,可以超越其指定空间大小输入,这也是
该使用该函数危险的重要原因,因而,需要慎重使用
两者的区别:
1、gets()输入时只有一个换行符,即用puts(s)输出时只换一次行,但fgets
()在小于指定字节范围内,fgets()会给窜末尾添加一耳光换行符,即用puts(
s)输出时,有两次换行。
2、gets()可以输入超过定义空间大小的字符,产生溢出,很危险,fgets()当输
入超过指定大小时,会截断你的输入,并将指定的字节输入,不会产生溢出,很
安全
写行I/O;
int puts(const char *s);
int fputs(const char *s,FILE *stream);第一个参数,是缓冲空间的首地址,
第二个参数是关联需要写入的流;
通过上面的函数可以实现linux中cat以及cp命令,源码如下:
cp的实现:
#include<stdio.h>
3 #include<stdlib.h>
4 int main(int argc,char *argv[]){
5 FILE *fp,*fp1;
6 char ch[100];
7 fp=fopen(argv[1],"r");
8 if(NULL == (fp=fopen(argv[1],"r"))){
9 printf("cannot open the file:\n");
10 return 0;
11 }
12 if(NULL == (fp1=fopen(argv[2],"w"))){
13 printf("cannot open argv[2]\n");
14 return 0;
15 }
16
17 while(fgets(ch,100,fp) != NULL){
18 fputs(ch,fp1);
19 }
20 fclose(fp);
21 fclose(fp1);
22 return 0;
23 }
文件i/o快读写:
size_t fread (void *ptr,size_t size,size_t,nemb,FILE *stream);第一个参
数是缓冲空间,第二个参数是对应数据类型的大小,第三个参数是,需要几个这
个数据类型大小;第三个参数,关联文件的流。
size_t fwrite(const void *ptr,sizr_t size,size_t nemmb, FILE *stream)
;第一个参数是区数据的缓冲空间,第四个参数是血药写入的文件关联流。
可以通过上面代码实现cp,源码如下:
2 #include<stdio.h>
3 #include<stdlib.h>
4 #include<string.h>
5 int main(int argc,char *argv[]){
6 FILE *fp,*fp1;
7 char ch[10000];
8 fp=fopen(argv[1],"r");
9 if(NULL == (fp=fopen(argv[1],"r"))){
10 printf("cannot open the file:\n");
11 return 0;
12 }
13 if(NULL == (fp1=fopen(argv[2],"w"))){
14 printf("cannot open argv[2]\n");
15 return 0;
16 }
17 while(fread(ch,sizeof(char),9999,fp)){
18 printf("to here\n");
19 fwrite(ch,sizeof(char),strlen(ch),fp1);
20 return 0;
21 }
22
23 }
标准i/o定位流
int fseek(FILE *stream,long offset,int whence);第一个参数,是关联需要定
位的流,第二个参数是偏移量,第三个参数是偏移的参照位置(SEEK_CUR(当前)
,SEEK_SET(文件开始),SEEK_END(文件末尾))
int ftell(FILE *stream);返回当前文件流指向的位置
int rewind(FILE *stream);将文件流重定向到文件的开始位置
测试代码如下:
2 #include<stdio.h>
3 int main(int argc,char *argv[]){
4 FILE *fp;
5 if(NULL == (fp=fopen(argv[1],"r"))){
6 printf("cannot open %s\n",argv[1]);
7 return 0;
8 }
9 while(!fseek(fp,100,SEEK_END)){ //fseek执行成功返回0,失败
返回-1,其
功能是,将fp偏向第三个参数(SEEK_CUR(当前位置,SEEK_END(末
尾),SEEK_SET(开始
位置)) )100个字节
10 printf("current offest is: %ld\n",ftell(fp));
11 fseek(fp,100,SEEK_CUR);
12 printf("current offest is: %ld\n",ftell(fp));
13 rewind(fp);
14 printf("current offest is: %ld\n",ftell(fp));
15 return 0;
16 };
18 }
关闭文件流:
int fclose(FILE *stream);
刷新缓存:int fflush(FILE *fp)-----非常重要