示例:复制文件到另外的文件,注意,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 Linux int scanf(const char *format,...); int fscanf(FILE *fp,const char *format,...); int sscanf(char *str,const char *format,...);
其他格式化方式参见其他文章
时间: 2024-12-28 12:44:25