初识C语言时,对文件输入输出模块并没有仔细去看,大致浏览了一遍就这样翻过去了 因为考试也不考,所以何必费那些闲工夫啊! 现在看来,C语言的文件输入输出模块对于一名程序员来说是非常有用的东西,没有这些,所有的操作只能说是纸上谈兵,关机之后统统的见鬼去了!近来想想,C语言这东西,挺适合自己自学的,并不是说明个人资质不错,只是学校教的东西,完全可以自己从书上获取,重要的是我们要用自己的双手成就自己的程序! 只有自己亲自实践过,才有自己的体会,这些东西可是灰常重要的!  好了,开始正题!


一、fgetc()与fputc()


#include "stdio.h"
#include "stdlib.h"
void writefile(FILE *fp)
{
    char ch;
    printf("请输入文件内容,以#结束! \n");
    ch=getchar();
    while(ch!='#')
    {
        fputc(ch,fp);                                    // fputc(ch,fp)
        ch=getchar();
    }
    rewind(fp);
}
void readfile(FILE *fp)
{
    char ch;
    printf("读取文件内容:\n");
    ch=fgetc(fp);
    while(!feof(fp))
    {
        putchar(ch);
        ch=fgetc(fp);                                    // ch=fgets(fp)
    }
    printf("\n文件读取结束\n");
}
int main()
{
    FILE * fp;
    char inputfile[20];
    printf("请输入文件名:");
    gets(inputfile);
    fp=fopen(inputfile,"w+");
    if(fp==NULL)
    {
        printf("打开文件失败!");
        exit (1);
    }
    else
    {
        printf("打开%s成功!\n",inputfile);
    }
    writefile(fp);
    readfile(fp);
    fclose(fp);
    return 0;
}


 fgetc()格式 变量=fgetc(文件指针) fputc()格式 fput(字符量,文件指针)

 若读写失败,都会返回符号常量EOF(在stdio.h中定义),值为-1

 getc()与fgetc()功能相同,putc()与fputc()功能相同


二、fgets()与fputs()


#include "stdio.h"
#include "stdlib.h"
int main()            //编程实现文件的复制
{
    FILE *fp;
    char str[100],s[100],filename[50];
    printf("请输入字符串:\n");
    gets(str);
    printf("请输入文件所在路径及名称:\n");
    scanf("%s",filename);
    if((fp=fopen(filename,"ab"))!=NULL)
    {
        fputs(str,fp);                              // fputs(str,fp)  把字符串str写入到文件中
        fclose(fp);
    }
    else
    {
        printf("打开失败!");
        exit(0);
    }
    if((fp=fopen(filename,"rb"))!=NULL)
    {
        printf("%s文件的内容是:\n",filename);
        while(fgets(s,sizeof(s),fp))                // fgets(str,n,fp)  从文件读出n-1字符串到str
        {
            printf("%s",s);
        }
        fclose(fp);
    }
    return 0;                                      
                                                                                                                                                                                                                                                                                                                                                                                            
}

 调用格式 fgets(字符数组名,n,文件指针) fputs(字符串,文件指针)

 fgets()会把n-1个字符复制到字符数组里,而不是n个


三、fscanf()与fprintf()


#include "stdio.h"
#include "stdlib.h"
struct rec
{
    char id[10];
    char name[20];
    float price;
    int count;
};
// 将键盘输入的信息写到文件中
void writefile(FILE *fp,int n)
{
    int i;
    struct rec record;                                         // 用作缓冲
    printf("******************请输入商品数据********************\n");
    for(i=0;i<n;i++)
    {
        printf("请输入序号:");
        scanf("%s",record.id);
        printf("请输入名称:");
        scanf("%s",record.name);
        printf("请输入价格:");
        scanf("%f",&record.price);
        printf("请输入数量:");
        scanf("%d",&record.count);
        fprintf(fp,"%s  %s  %.2f    %d \n",record.id,record.name,record.price,
                record.count);
    }
}
// 从文件读出商品信息
void readfile(FILE *fp,int n)
{
    struct rec record;                                       // 用作缓冲
    double total =0;
    rewind(fp);
    while(fscanf(fp,"%s %s %f %d\n",record.id,record.name,
                 &record.price,&record.count)!=EOF)
    {
        printf("序号:%s 名称:%s 价格:%5.2f 数量:%d \n",record.id,record.name,
               record.price,record.count);
               total=total+record.price*record.count;
    }
    printf("合计:%5.2f",total);
}
int main()
{
    char filename[20];
    int n;
    FILE * fp;
    printf("请输入目标文件:\n");
    scanf("%s",filename);
    printf("请输入商品数量:\n");
    scanf("%d",&n);
    fp=fopen(filename,"w+");
    if(fp==NULL)
    {
        printf("打开文件失败!");
        exit(1);
    }
    writefile(fp,n);
    readfile(fp,n);
                                                                                                                                                                                                                                                                                                                                             
    fclose(fp);                            
    return 0;
}

 调用格式 fscanf(文件指针,格式字符串,输入参数)  如:fscanf(fp,"%d %s",&i,str)

          fprintf(文件指针,格式字符串,输出参数列表) 如:fprintf(fp,"%d %s",i,str)

 该程序在主函数完成打开、关闭文件 在被调函数中定义缓冲结构体用于数据的输入输出


四、fread()与fwrite()


#include "stdio.h"
#include "stdlib.h"
struct rec
{
    char id[10];
    char name[20];
    float price;
    int count;
};
// 将键盘输入的信息写到文件中
void writefile(FILE *fp,int n)
{
    int i;
    struct rec record;                                         // 用作缓冲
    printf("******************请输入商品数据********************\n");
    for(i=0;i<n;i++)
    {
        printf("请输入序号:");
        scanf("%s",record.id);
        printf("请输入名称:");
        scanf("%s",record.name);
        printf("请输入价格:");
        scanf("%f",&record.price);
        printf("请输入数量:");
        scanf("%d",&record.count);
        // fprintf(fp,"%s  %s  %.2f    %d \n",record.id,record.name,record.price,
          //      record.count);
        fwrite(&record,sizeof(record),1,fp);
    }
}
// 从文件读出商品信息
void readfile(FILE *fp,int n)
{
    struct rec record;                                       // 用作缓冲
    double total =0;
    rewind(fp);
    // while(fscanf(fp,"%s %s %f %d\n",record.id,record.name,
       //          &record.price,&record.count)!=EOF)
    while(fread(&record,sizeof(record),1,fp))
    {
        printf("序号:%s 名称:%s 价格:%5.2f 数量:%d \n",record.id,record.name,
               record.price,record.count);
               total=total+record.price*record.count;
    }
    printf("合计:%5.2f",total);
}
int main()
{
    char filename[20];
    int n;
    FILE * fp;
    printf("请输入目标文件:\n");
    scanf("%s",filename);
    printf("请输入商品数量:\n");
    scanf("%d",&n);
    fp=fopen(filename,"ab+");
    if(fp==NULL)
    {
        printf("打开文件失败!");
        exit(1);
    }
    writefile(fp,n);
    readfile(fp,n);
                                                                                                                                                                                                                                           
    fclose(fp);                            
    return 0;
}


 格式 fwrite(buffer,size,count,fp) fread(buffer,size,count,fp)

 buffer 存放输入输出数据的首地址 size 数据块的大小(字节数) count 数据块的个数

 读写成功返回值都是count的值 失败返回0 可以依据此判断文件是否读写结束


Summary:

1. fgetc与fputc 用于读写单个字符

2. fgets与fputs 用于读写一个字符串

3. fscanf与fprintf 用于格式化读写数据块

4. fread与fwrite 用于非格式化读写二进制文件


这就是这个周六的看书总结了,有错误或是不清楚的地方欢迎大家提出,指正 C语言文件读写函数的对比介绍_文件读写函数