C语言|文件读写,代码运行后留下“记忆”

简介: 对于一个代码,运行时可能需要保留产生的结果,例如计算值,筛选值,记录点或者小游戏的得分,而正常情况下我们要保存一个数据,想到的肯定是打开我们的文本软件,手撸文字,今天这篇文章,带你一起,教代码写下它的“记忆”

前言

对于一个代码,运行时可能需要保留产生的结果,例如计算值,筛选值,记录点或者小游戏的得分,而正常情况下我们要保存一个数据,想到的肯定是打开我们的文本软件,手撸文字,今天这篇文章,带你一起,教代码写下它的“记忆”

网络异常,图片无法展示
|

了解文件本质

对于文本文件和二进制文件,其实都是代表了一系列的字节,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;
}

此时我们尝试一下运行,输入:

网络异常,图片无法展示
|

结果:

网络异常,图片无法展示
|

就是这么的神奇

接下来我们还可以进行一些有趣的功能

读取”记忆“

实现统计文章某个字出现频率

  1. 对于一个不需要写入的文本,我们就以r只读的方式来打开它
  2. 如果打不开,给出错误提示
  3. 运用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“成员给揪出来了

网络异常,图片无法展示
|

相关文章
|
19天前
|
存储 编译器 C语言
如何在 C 语言中判断文件缓冲区是否需要刷新?
在C语言中,可以通过检查文件流的内部状态或使用`fflush`函数尝试刷新缓冲区来判断文件缓冲区是否需要刷新。通常,当缓冲区满、遇到换行符或显式调用`fflush`时,缓冲区会自动刷新。
|
19天前
|
存储 编译器 C语言
C语言:文件缓冲区刷新方式有几种
C语言中文件缓冲区的刷新方式主要包括三种:自动刷新(如遇到换行符或缓冲区满)、显式调用 fflush() 函数强制刷新、以及关闭文件时自动刷新。这些方法确保数据及时写入文件。
|
30天前
|
存储 搜索推荐 C语言
深入C语言指针,使代码更加灵活(二)
深入C语言指针,使代码更加灵活(二)
|
30天前
|
存储 程序员 编译器
深入C语言指针,使代码更加灵活(一)
深入C语言指针,使代码更加灵活(一)
|
30天前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
1月前
|
C语言
【C语言】探索文件读写函数的全貌(三)
【C语言】探索文件读写函数的全貌
|
1月前
|
存储 C语言
【C语言】探索文件读写函数的全貌(二)
【C语言】探索文件读写函数的全貌
|
1月前
|
C语言
C语言练习题代码
C语言练习题代码
|
29天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
32 3
|
20天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
33 10