21天C语言代码训练营(第十五天)

作者: 天花板 | 来源:发表于2016-03-01 22:06 被阅读839次

    之前我们已经完成了录入数据和查询数据的工作,不过当我们关掉程序再重新打开的时候,之前录入的数据就都不存在了。这当然不能满足我们的要求。

    在软件设计中,如果要实现重启程序或者重启电脑依然能够恢复之前的数据,那么我们需要在程序退出前把需要保存的数据记录在文件中。今天我们就来说说C语言操作文件的那些事儿。

    文件操作方法

    文件操作总共分三步:

    • 打开文件
    • 读写操作
    • 关闭文件

    C语言中,使用FILE类型管理文件。

    1. 打开文件

    我们可以调用系统函数fopen来打开文件。

    fopen的原型是:

    FILE *fopen(const char *filename,const char *mode)
    

    功能:

    打开一个流,把一个文件和此流相连接,给此流返回一个FILR指针。filename指向要打开的文件名,mode表示打开状态的字符串,其取值如下:

    • "r" 以只读方式打开文件
    • "w" 以只写方式打开文件
    • "a" 以追加方式打开文件
    • "r+" 以读/写方式打开文件,如无文件出错
    • "w+" 以读/写方式打开文件,如无文件生成新文件

    成功返回文件指针,失败返回NULL

    代码如下:

    // 以文本形式打开一个用于写的文件
    FILE *fp = fopen("book.txt", "w"); 
    if (fp == NULL)
    {
        exit(0);
    }
    

    // 以文本形式打开一个用于读的文件
    FILE *fp = fopen("book.txt", "r");
    if (fp == NULL)
    {
        exit(0);
    }
    

    注意,用来读和写的文件打开时传入的参数不同。

    2. 读写文件

    • 读文件 fread()

    这是一个比较常用的读文件接口,它的功能是从文件中读取一段数据。

    char pBuf[1024]; 
    fread(pBuf, sizeof(char), 10 , fp);
    

    这两句的意思是从fp指向的文件中读取10个字符的数据保存在pBuf中。

    • 写文件 fwrite()

    这个函数负责把一段数据写在文件中。

    char pBuf[] = "Hello World"; 
    fwire(pBuf, sizeof(char), 11, fp); 
    

    这两句的意思是把pBuf中的数据写入fp指向的文件中。

    3. 关闭文件

    调用fclose函数关闭之前打开的数据流。

    fclose(fp);
    

    文件操作功能封装

    为了方便我们后面在项目中方便地使用这些功能,我们把文件操作模块封装在一组文件中。代码如下:

    • MyFile.h

        #ifndef __MY_FILE_H__
        #define __MY_FILE_H__
        
        #include <stdio.h>
        
        #define FOR_READ        0
        #define FOR_WRITE       1
        
        FILE* fp;
        
        extern int OpenFile(char* pFileName, int nOperate);
        extern void CloseFile();
        
        extern char* ReadLine();
        extern int WriteLine(char* pLine);
        
        #endif
      
    • MyFile.c

        #include "MyFile.h"
        
        #include "string.h"
        
        #define BUF_SIZE 100
        char pBuf[BUF_SIZE];
        
        int OpenFile(char* pFileName, int nOperate)
        {
            switch (nOperate)
            {
            case FOR_READ:
                fp = fopen(pFileName, "r");
                break;
            case FOR_WRITE:
                fp = fopen(pFileName, "w+");
                break;
            default:
                break;
            }
        
            return 1;
        }
        
        void CloseFile()
        {
            fflush(fp);
            fclose(fp);
        }
        
        char* ReadLine()
        {
            fread(pBuf, sizeof(char), 100, fp);
        
            return pBuf;
        }
        
        int WriteLine(char* pLine)
        {
            fwrite(pLine, sizeof(char), strlen(pLine), fp);
            fwrite("\n", sizeof(char), 1, fp);
        
            return 1;
        }
      

    在CloseFile中,我们在关闭文件之后,通过fflush()函数把缓冲区中的数据写在文件中。

    代码调用

    如何使用这组函数呢?我们来看下面这段代码:

    #include "stdio.h"
    
    #include "MyFile.h"
    
    int main()
    {
        OpenFile("a.txt", FOR_WRITE);
    
        WriteLine("ABCD");
        
        CloseFile();
    
        OpenFile("a.txt", FOR_READ);
    
        char* pLine = ReadLine();
    
        printf("%s\n", pLine);
    
        CloseFile();
    
        return 0;
    }
    

    这段代码的功能是打开一个文件“a.txt”之后写入一个字符串,之后再读出来打印在屏幕上。

    今天就到这里,下一篇中,我们用这个模块完成数据的保存和读取功能。

    我是天花板,让我们一起在软件开发中自我迭代。
    如有任何问题,欢迎与我联系。


    上一篇:21天C语言代码训练营(第十四天)
    下一篇:21天C语言代码训练营(第十六天)

    相关文章

      网友评论

      本文标题:21天C语言代码训练营(第十五天)

      本文链接:https://www.haomeiwen.com/subject/sicnkttx.html