1.5 fgets fputs fread fwrite
char *gets(char *s);
一般不要用:因为他的参数只是一个地址,不知道空间大小,输入缓冲区容易溢出;
char *fgets(char *s, int size, FILE *stream);
参数1:数据存放首地址
参数2:读的数据大小size-1
参数3:要读的数据流
功能:从一个stream中读取不超过size大小的数据并存放到以s为起始地址的buf中去;行缓冲????
返回值:正常返回s,出错或者读到文件尾返回NULL;
正常结束两种情况:
size -1 +'\0'
'\n'
eg:#define SIZE 5
char buf[SIZE];
fgets(buf,SIZE,stream);
要读abcd这个字符串的话需要读2次
1---> a b c d '\0'
2--->'\n' '\0'
int fputs(const char *s, FILE *stream);
参数1:要写的字符串起始地址
参数2:要被写入的流
功能:写一个起始地址为s的字符串到stream中
返回值:成功返回非负整数,失败返回EOF
范例:实现文件复制功能----使用fgets与fputs函数
/*./mycpy src dest*/ #include <stdio.h> #include <stdlib.h> /* argv[1]:src argv[2]:dest */ #define BUFSIZE 1024 int main(int argc , char **argv) { FILE *fps ; FILE *fpd ; char buf[BUFSIZE]; if(argc < 3) { fprintf(stderr,"Usage:%s <src.file> <dest.file>\n",argv[0]); exit(1); } fps = fopen(argv[1],"r"); if(fps == NULL) { perror("fopen()"); exit(1); } fpd = fopen(argv[2],"w+"); if(fpd == NULL) { perror("fopen()"); fclose(fps); exit(1); } while(fgets(buf,BUFSIZE,fps) != NULL) fputs(buf, fpd); fclose(fpd); fclose(fps); exit(0); }
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从stream中读nmemb个对象,每个对象size大小,读到ptr地址中去;
返回值:真实读入元素的个数
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从ptr起始的地址,写nmemb个对象,每个对象size个大小,写到stream中
返回值:真实写入元素的个数
范例:实现文件复制功能----使用fread与fwrite函数
/*./mycpy src dest*/ #include <stdio.h> #include <stdlib.h> /* argv[1]:src argv[2]:dest */ #define BUFSIZE 1024 int main(int argc , char **argv) { FILE *fps ; FILE *fpd ; int num = 0 ; char buf[BUFSIZE]; if(argc < 3) { fprintf(stderr,"Usage:%s <src.file> <dest.file>\n",argv[0]); exit(1); } fps = fopen(argv[1],"r"); if(fps == NULL) { perror("fopen()"); exit(1); } fpd = fopen(argv[2],"w+"); if(fpd == NULL) { perror("fopen()"); fclose(fps); exit(1); } while((num = fread(buf,1,BUFSIZE,fps)) > 0) fwrite(buf,1,BUFSIZE,fpd); fclose(fpd); fclose(fps); exit(0); }