之前我们已经完成了录入数据和查询数据的工作,不过当我们关掉程序再重新打开的时候,之前录入的数据就都不存在了。这当然不能满足我们的要求。
在软件设计中,如果要实现重启程序或者重启电脑依然能够恢复之前的数据,那么我们需要在程序退出前把需要保存的数据记录在文件中。今天我们就来说说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语言代码训练营(第十六天)