首页 > 代码库 > 基于流的文件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