前言
对于一个代码,运行时可能需要保留产生的结果,例如计算值,筛选值,记录点或者小游戏的得分,而正常情况下我们要保存一个数据,想到的肯定是打开我们的文本软件,手撸文字,今天这篇文章,带你一起,教代码写下它的“记忆”
了解文件本质
对于文本文件和二进制文件,其实都是代表了一系列的字节,C语言提供了底层调用来处理存储设备上的文件,而从一个C语言程序中移出字节,这种字节流就叫做数据流
数据流(data stream)是一组有序,有起点和终点的字节的数据序列。包括输入流和输出流。
文件读写
在需要创建或者要打开一个文件时,我们就可以使用fopen()函数,而关闭文件则需使用fclose()函数
创建或者打开时会初始化类型FILE的一个对象,格式:
FILE *fopen( const char *filename, const char *mode );
其中filename是文件的命名,而mode是打开的模式,制作了一个表格方便查阅
mode(模式) |
功能 |
r |
以只读的形式打开一个已有的文本文件,允许读取文件(不存在则出错) |
w |
以写入的形式打开文本文件,不存在,则创建新文件,反之,则从文件起始位置写,覆盖原内容 |
a |
以追加模式打开文本文件,不存在,则创建,会在已有文件的内容后边追加内容,不会覆盖原有内容 |
r+ |
以读写的形式打开文本文件,从头开始读,新数据写入只覆盖所占的空间 |
w+ |
创建一个新文件,进行写入,从头开始读,文件存在的话原内容全部消失,不存在则创建新文件 |
a+ |
可以和a一样追加内容,同时从头开始读 |
wb |
只写模式打开二进制文件 |
rb |
只读模式打开二进制文件 |
ab |
追加模式打开二进制文件 |
rb+ |
读写打开一个二进制文件,只允许读写数据。 |
rt+ |
读写打开一个文本文件,允许读和写。 |
wb+ |
读写打开或建立一个二进制文件,允许读和写。 |
wt+ |
读写打开或着建立一个文本文件;允许读写。 |
at+ |
读写打开一个文本文件,允许读或在文本末追加数据。 |
ab+ |
读写打开一个二进制文件,允许读或在文件末追加数据。 |
处理二进制文件还可用 r+b,w+b,a+b等 |
以上面的格式为例,打开或者创建一个文本文件,然后再关闭
int main() { FILE* zh; f = fopen("word.txt", "w"); //格式例子 if (zh != NULL) { fputs("fopen example", zh); fclose(zh); zh=NULL; } return 0; }
如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。
EOF 是一个定义在头文件 stdio.h 中的常量。 C 标准库提供了各种函数来按字符或者以固定长度字符串的形式读写文件。
学会了文件的打开模式后,我们就开始书写代码的“记忆”
文件的读写函数
- fgetc():读取一个字符
- fputc():写入一个字符
- fgets():读取一个字符串
- fputs():写入一个字符串
- fprintf():写入格式化数据
- fscanf():格式化读取数据
- fread():读取数据
- fwrite():写入数据
我们可以先小试牛刀
试着写入字符进一个txt文件里
第一步:先在一个地方创建文件夹(方便存储产生的文件,这里以C盘为例,我创建了一个名为tmp的文件夹)
第二步:敲入我们的代码
#include <stdio.h> int main(){ FILE *fp = NULL; //FILE *fp 是声明,声明fp是指针,用来指向FILE类型的对象。 fp = fopen("C:/tmp/1.txt","w+"); /*fopen,以w+允许读写的模式打开路径上的1.txt文件 此时没有1.txt文件,则自动新建*/ char c = 'c'; fputc(c,fp); fprintf(fp,"\n"); fprintf(fp,"This is testing for fprintf...\n"); fputs("This is testing for fputs...\n",fp); fclose(fp); }
看我们的第五行代码,因为tmp文件夹是新建的,所以里面没有文件,此时我们运行代码后,文件夹里就自动生成了1.txt文件
然后使用了fputc()输入单个字符,fprintf()和fputs()写入了两行字符串
当字符多于一个时,fputc()就会报错
我们先看刚刚运行代码后的结果
此时txt文件中就出现了我们想要的字符
如何实现回应键盘效果,将键盘上输入的字符都写入文件中,实现打字效果呢?
这里我们就可以写一个while循环体,运用getchar()每次都从键盘读取一个字符存进遍历中,然后写入文件
运用键盘往文件里写入字符(实现打字效果)
#include<stdio.h> int main(){ FILE *fp; char ch; fp=fopen("C:/tmp/2.txt","wt+"); printf("输入一段字符串,回车代表终止\n"); while((ch=getchar())!='\n'){ fputc(ch,fp); //可以输入中文喔 } fclose(fp); return 0; }
此时我们尝试一下运行,输入:
结果:
就是这么的神奇
接下来我们还可以进行一些有趣的功能
读取”记忆“
实现统计文章某个字出现频率
- 对于一个不需要写入的文本,我们就以r只读的方式来打开它
- 如果打不开,给出错误提示
- 运用fgetc()读取字符,通过while循环重复操作,直到无法读取到字符为止(即读完文章最后一个字符)
#include <stdio.h> int main () { FILE * fp; int ch; int n = 0; fp = fopen ("C:/tmp/myfile.txt", "r"); if (fp == NULL) perror ("无法打开此文件"); // 打开失败 else { while (ch != EOF) { ch = fgetc (fp); // 获取一个字符 if (ch == 'a') n++; // 统计美元符号 'a' 在文件中出现的次数 } fclose (fp); // 一定记得要关闭文件 printf ("a的个数为%d个。\n",n); } return 0; }
我们预存一个文件,内容有这些
接下来我们执行上面的代码,十分简单地就把这段乱码中的”a“成员给揪出来了