在之前的章节中,我们将程序关闭后,程序中的数据将全部清空。下次启动程序后,一切都得从头开始。那么,怎样才能将程序中的数据保存。待下次重新启动程序时,复现之前保存的数据呢?
为了实现这种需求,我们可以借助文件。
在需要时,可以将程序中的数据保存为一个文件。待下次重新启动程序时,从之前保存的文件中提取数据。这样,程序就不会在重启后失忆了。
1. 创建并写入文件
为了操作文件,我们需要借助几个在头文件stdio.h
中声明的库函数。
创建或打开文件fopen
函数。
fopen
函数原型如下:
FILE *fopen (const char * filename, const char * mode);
输入:
const char * filename
文件路径,可以使用相对路径或绝对路径。
const char * mode
操作模式
输出:
如果文件创建或打开成功,则返回一个指针。这个指针指向一个记录文件信息的结构FILE
。其他各种文件操作函数,需要这个结构指针才能对fopen
打开或创建的文件进行操作。我们无需过多地关注这个结构的具体组成,仅需要将这个结构指针传递给各种文件操作函数即可。
例如,我们使用相对路径data.txt
,将在当前目录下,创建一个名为data.txt的文件。
当然,你也可以在windows上使用形如F:/projects/data.txt
的绝对路径,在F盘下的project文件夹中,创建data.txt文件。
#include <stdio.h>
int main()
{
// 创建一个名为data.txt的文件
FILE *pFile = fopen("data.txt", "w");
if(pFile == NULL)
{
// 文件创建失败
return -1;
}
// 文件创建成功
return 0;
}
函数fopen
的第一个参数为字符串,内容为需要操作的文件路径,第二个参数也为字符串,内容为文件的操作模式。
先介绍两种模式:
"r"
模式,读模式,取自read的首字母。对文件进行读取操作。
"w"
模式,写模式,取自write的首字母。对文件进行写入操作。如果文件存在,清空原文件内容,不存在则创建一个新文件。
程序运行后,我们即可在当前目录下,看到data.txt
。当然,我们没有写入任何内容。使用文本编译器打开后,我们发现是一个空文件。
之前,我们使用过printf
在控制台上输出一串字符。若需要将字符串输出到文件内,有一个非常类似的函数fprintf
。它就相当于在函数printf
第一个参数前,加了一个文件结构指针参数,用于指明操作哪个文件。其他的使用方法和printf
几乎一致。
fprintf
的函数原型:
int fprintf (FILE * stream, const char * format, ...);
下面是输出3个数据的示例:
使用函数printf
打印到控制台:
int n = 123;
double f = 3.1415;
char ch = 'A';
printf("%d\n", n);
printf("%f\n", f);
printf("%c\n", ch);
使用函数fprintf
输出到文件:
int n = 123;
double f = 3.1415;
char ch = 'A';
fprintf(pFile, "%d\n", n);
fprintf(pFile, "%f\n", f);
fprintf(pFile, "%c\n", ch);
虽然程序结束会为我们自动关闭文件。如果在程序运行期间,不需要再次操作文件了,可以调用函数fclose
关闭文件。并且,关闭所有资源再结束程序是一个良好的编程习惯。
fclose(pFile);
完整代码如下:
#include <stdio.h>
int main()
{
// 创建一个名为data.txt的文件
FILE *pFile = fopen("data.txt", "w");
if(pFile == NULL)
{
// 文件创建失败
return -1;
}
// 文件创建成功
int n = 123;
double f = 3.1415;
char ch = 'A';
// fprintf第一个参数为文件结构指针,其后参数与printf一致
fprintf(pFile, "%d\n", n);
fprintf(pFile, "%f\n", f);
fprintf(pFile, "%c\n", ch);
// 关闭文件
fclose(pFile);
return 0;
}
再次打开文件data.txt
,我们可以发现,里面有刚刚写入的三个变量的值,并且每打印一个变量换行一次。