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“成员给揪出来了

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

相关文章
|
29天前
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
49 4
|
19天前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
26天前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
21天前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
67 3
|
20天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
49 1
|
2月前
|
存储 编译器 C语言
如何在 C 语言中判断文件缓冲区是否需要刷新?
在C语言中,可以通过检查文件流的内部状态或使用`fflush`函数尝试刷新缓冲区来判断文件缓冲区是否需要刷新。通常,当缓冲区满、遇到换行符或显式调用`fflush`时,缓冲区会自动刷新。
|
2月前
|
存储 编译器 C语言
C语言:文件缓冲区刷新方式有几种
C语言中文件缓冲区的刷新方式主要包括三种:自动刷新(如遇到换行符或缓冲区满)、显式调用 fflush() 函数强制刷新、以及关闭文件时自动刷新。这些方法确保数据及时写入文件。
|
2月前
|
C语言
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
深入C语言指针,使代码更加灵活(三)
|
Java Android开发 C语言
03_Android NDK中C语言调用Java代码,javah的使用,javap的使用以及生成签名,Android.mk的编写,C代码的编写
 1  案例场景,通过C语言回调Java的代码,案例的最终界面: 2  案例的代码结构如下: 3 编写DataProvider的代码: package com.example.ndkcallback;   public class DataProvider {     //C调用java空方法     public void helloFromJav
1447 0
|
18天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
39 10