几种文件打开方式之间的区别

来源:互联网 发布:复古美颜相机软件 编辑:程序博客网 时间:2024/05/17 03:23

/*----------------------------------------------------------
    说明:本程序的目的是通过一系列实例说明文件打开方式
          w+ 、r+、a+的区别。请先运行一下看下效果,并分
          别查看生成中的数据。        
------------------------------------------------------------*/
#include <stdio.h>

/*函数:存取文件操作,pchFileName为文件名,pchMode为文件打开方式*/
FILE *fnpflFileOperation(char *pchFileName, char *pchMode);
/*函数:区分各种文件打开方式*/
void fnvDivisionOfEachMode();
/*函数:辨别r+和a+文件打开方式指针所指位置*/
void fnvPositionOfPoint();

main()
{
    /*函数:区分各种文件打开方式*/
    fnvDivisionOfEachMode();
    /*函数:辨别r+和a+文件打开方式指针所指位置*/
    fnvPositionOfPoint();
}

/*函数:存取文件操作,pchFileName为文件名,pchMode为文件打开方式*/
FILE *fnpflFileOperation(char *pchFileName, char *pchMode)
{
    FILE *pflFile;
    static int iCount = 0;

    printf("/t-------%d-------/n/n", ++iCount);
    pflFile = fopen(pchFileName, pchMode); /*以pchMode方式,打开pchFileName*/

    if (pflFile == NULL){
        printf("%s open error!/n/n", pchFileName);
        //exit(0);      /*为了查看效果,先把这里注释掉,以免自动退出*/
    }else printf("%s OK!/n/n", pchFileName);

    return pflFile;     /*返回指向所打开文件的指针*/
}

/*函数:区分各种文件打开方式*/
void fnvDivisionOfEachMode()
{
    FILE *pflFile;
    /*---------------------------------------------------------------------
    以w+方式打开test.txt, 最初文件不存在,创建并写入数据*/
    pflFile = fnpflFileOperation("test.txt", "w+");
    fprintf(pflFile, "1st:w+1234567890/n");
    fclose(pflFile);
    printf("Please check up the file!/n");
    system("pause");    /*暂停,可以去查看test.txt中的数据*/

    /*-------------------------------------------------------------------*/

    /*---------------------------------------------------------------------
    以r+方式打开radd.txt, 文件不存在,出错,将看到出错提示*/
    pflFile = fnpflFileOperation("radd.txt", "r+");
    fprintf(pflFile, "2nd:r+/n");
    fclose(pflFile);
    printf("Please check up the file!/n");
    system("pause");   /*暂停,可以去查看radd.txt是否被创建*/
    /*-------------------------------------------------------------------*/

    /*--------------------------------------------------------------------
    以a+方式打开aadd.txt, 最初文件不存在,创建并写入数据*/
    pflFile = fnpflFileOperation("aadd.txt", "a+");
    fprintf(pflFile, "4th:a+/n");
    fclose(pflFile);
    printf("Please check up the file!/n");
    system("pause");    /*暂停,可以去查看aadd.txt中的数据*/
    /*------------------------------------------------------------------*/

    /*--------------------------------------------------------------------
    以r+方式打开已存在文件test.txt ,在文件首写入数据并覆盖当前位置数据*/
    pflFile = fnpflFileOperation("test.txt", "r+");
    fprintf(pflFile, "5nd:r+/n");
    fclose(pflFile);
    printf("Please check up the file!/n");
    system("pause");   /*暂停,可以去查看test.txt中的数据*/
    /*------------------------------------------------------------------*/

    /*--------------------------------------------------------------------
    以a+方式打开已存在文件test.txt ,向文件追加数据*/
    pflFile = fnpflFileOperation("test.txt", "a+");
    fprintf(pflFile, "6th:a+/n");
    fclose(pflFile);
    printf("Please check up the file!/n");
    system("pause");   /*暂停,可以去查看test.txt中的数据*/
    /*------------------------------------------------------------------*/
}

/*函数:辨别r+和a+文件打开方式指针所指位置*/
void fnvPositionOfPoint()
{
    int chReadAChar;
    FILE *pflFile1;

    /*以r+方式打开test.txt*/
    pflFile1 = fnpflFileOperation("test.txt", "r+");

    /*读取test.txt中数据,从文件首开始读取,将输入文件中所有字符*/
    while (!feof(pflFile1)){
        if ((chReadAChar = fgetc(pflFile1)) != EOF)
            fputc(chReadAChar, stdout);
        else printf("EOF!/n/n");  /*到达文件为的情况*/
    }

    fclose(pflFile1);
    system("pause");

    /*-------------------------------------------------------------------*/
    /*以a+方式打开test.txt*/
    pflFile1 = fnpflFileOperation("test.txt", "a+");
    fseek(pflFile1, -1L, SEEK_CUR);  /*指针回退一个字节长度,此句可注释掉查看效果*/

    /*读取test.txt中数据,从文件尾前开始读取,不能输出文件中数据*/
    while (!feof(pflFile1)){
        if ((chReadAChar = fgetc(pflFile1)) != EOF)
            fputc(chReadAChar, stdout);
        else printf("EOF!/n/n");  /*到达文件尾的情况*/
    }

    fclose(pflFile1);
    system("pause");
}

/*-------------------------------------------------------------------
    总结:

        由以上程序可以理解,w+、r+、a+之间的区别:
        w+:首先创建一个文件,然后向里面写数据。如果此文件
           已存在,则重新创建并将原来文件覆盖掉,原本的数
           据将丢失。
        r+:打开一个已存在的文件,但不重新创建。如果该文件
           不存在,将会出错。文件打开后,指针指向文件首部
           。如果向其写入数据,则将逐个覆盖当前位置数据。
        a+:打开一个已存在的文件,但不重新创建。如果该文件
           不存在,则进行创建。文件打开后,指针指向文件尾
           部。如果向其写入数据,则写入的数据追加到原有数
           据之后?

        注:如果指针在文件尾不进行判断并停止读取的话,指针
            将会回到文件首部继续读取数据。?
-------------------------------------------------------------------*/

原创粉丝点击