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

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

在软件设计中,如果要实现重启程序或者重启电脑依然能够恢复之前的数据,那么我们需要在程序退出前把需要保存的数据记录在文件中。今天我们就来说说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语言代码训练营(第十六天)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容