码迷,mamicode.com
首页 > 其他好文 > 详细

基于流的文件IO

时间:2014-09-03 23:55:27      阅读:309      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   color   os   io   使用   ar   for   

示例:复制文件到另外的文件,注意,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,...);

 

其他格式化方式参见其他文章

基于流的文件IO

标签:des   style   blog   color   os   io   使用   ar   for   

原文地址:http://www.cnblogs.com/lhyz/p/3954955.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!