首页 > 代码库 > 基于流的文件IO
基于流的文件IO
示例:复制文件到另外的文件,注意,hello.txt必须存在文本才能看到结果
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 int main(void) 5 { 6 FILE *fp1, *fp2; 7 int c; 8 9 if((fp1=fopen("hello.txt","rb"))==NULL)10 {11 printf("error to read\n");12 exit(1);13 }14 if((fp2=fopen("desk.txt","wb"))==NULL)15 {16 printf("fails to open file 2");17 exit(1);18 }19 20 while((c=fgetc(fp1))!=EOF)21 {22 if(fputc(c,fp2)==EOF)23 {24 printf("error to print\n");25 exit(1);26 }27 }28 fclose(fp1);29 fclose(fp2);30 return 0;31 }
可以看出,基本上
打开文本文件使用:
fopen()函数,
使用fclose()关闭文本;使用fgetc从文本中获取文本
使用fputs将文本写入流,因此fp2处也可以是stdout,此时会将文件内容写出到标准输出;
1.
字符的读取
#include<stdio.h>int getc(FILE *fp);int fgetc(FILE *fp);int getchar(void);
使用getchar时,通过Ctrl+D可以发送EOF信号
2.
字符的输出
#include<stdio.h>int putc(int c,FILE *fp);int fputc(int c,FILE *fp);int putchar(void);
putchar和getchar的定义类似
3.
基于行的IO
输入:
#include<stdio.h>char *fgets(char *buf,int n,FILE *fp);char *gets(char *buf);
返回的是缓冲区的首地址,n为指定要读取的字符数,gets是从标准输入读取
注意,fgets遇到\n就不读取了,保证最后一位为‘\0’,也就是说,最后缓冲区最多只有n-1个字符被读入,最后一位是\0
gets函数是一个危险的函数,在gcc中会警告,不建议使用。
因为gets不检查输入的数目,因此可能造成溢出而使程序崩溃。
输出:
#include<stdio.h>int fputs(const char *buf,FILE *restrict fp);int puts(const char *str);
restrict是C99的新标准,表示限定地址的指针访问,就是只能使用fp这个指针访问此地址,其他指向此地址的指针都无效
puts安全性也不高,因此也不建议使用。
4.
直接IO
#include<stdio.h>size_t fread(void *ptr,size_t size,size_t nmemb,FILE *fp);size_t fwrite(const void *ptr,size_t size, size_t nmemb,FILE *fp);
这两个函数用于读写块和对象可以这样使用
将数组的一部分写入到流中
if(fwrite(&data[2],sizeof(float),4,fp)!=4) { printf("error"); exit(1); }
将结构写入文件
struct { short count; long total; char name[20]; }item; if(fwrite(&item,sizeof(item),1,fp)!=1) { printf("error\n"); }
结合起来就是可以读写结构数组
典型应用就是通讯录的读取和写入
下面是用直接IO的方式复制文件的示例:
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define SRC "hello.txt" 5 #define DES "des.txt" 6 7 int main(void) 8 { 9 FILE *fp1,*fp2;10 char buf[1024];11 int n;12 if((fp1=fopen(SRC,"rb"))==NULL)13 {14 printf("error 1\n");15 exit(1);16 }17 if((fp2=fopen(DES,"wb"))==NULL)18 {19 printf("error 2\n");20 exit(1);21 }22 while((n=fread(buf,sizeof(char),1024,fp1))>0)23 {24 if(fwrite(buf,sizeof(char),n,fp2)==-1)25 {26 printf("error 3\n");27 exit(1);28 }29 }30 if(n==-1)31 {32 printf("error 4\n");33 exit(1);34 }35 fclose(fp1);36 fclose(fp2);37 return 0;38 }
5.
格式化IO
#include<stdio.h>int printf(const char *format,...);int fprintf(FILE *fp,const char *format,...);int sprintf(char *str,const char *format,...);int snprintf(char *str,size_t size,const char *format);//maybe only in Linuxint scanf(const char *format,...);int fscanf(FILE *fp,const char *format,...);int sscanf(char *str,const char *format,...);
其他格式化方式参见其他文章
基于流的文件IO
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。