十分钟搞懂C语言的文件操作



本文参考:浙大版《C语言程序设计(第4版)》

  1. 什么是文件操作
  2. 怎么实现基础文件操作
  3. 其它文件操作

一、什么是文件操作?

直接来看不太方便理解,我们把它分开。

文件

文件可以通过应用程序创建,如运行“记事本”程序,输入一些数据,然后保存并输入文件名,就会在磁盘中产生一个文本文件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

刚刚我们创建的只是一种文件,叫做文本文件,还有好多其它类型的文件,每个文件都有自己的属性

文件的概念

在操作系统中,文件是指驻留在外部介质(如磁盘等)中的一个有序数据集
它可以是源文件、目标程序文件、可执行程序,也可以是待输入的原始数据,或是一组输出的结果。

文件的分类

源文件、目标文件和可执行程序可称为程序文件,输入输出数据可称为数据文件。数据文件还可分为各种类型,如文本文件、图像文件、声音文件等。使用应用程序时,通常保存功能实现把数据从内存写入到文件,这就是所谓的(存盘),打开功能实现把磁盘文件的内容读入到内存。

我们需要重点关注的类型就是数据文件
最直观的例子也就是记事本(可编辑的文本文档)

如果在用“记事本”程序编辑文件时不“保存”,数据就不会写入到磁盘,即若不保存而直接关闭了应用程序,数据就会消失。实际上,用“记事本”程序编辑文件时,输入的数据先是在内存中,保存后,数据才被写入到磁盘文件中。 这其实有点类似我们打游戏时的“存档”,不存档=刚刚的努力白费了

操作

我们需要了解的就是读和写两个操作,简单来说

读:scanf做的事情
写:printf做的事情

当上升到文件层面时,“读”就不再是我们平时那样,从键盘读入,而是从数据文件中(最常见的就是记事本)读入;“写”也就是输出,同样地,不会像我们之前写程序那样,显示在屏幕上,而是写在数据文件中(最常见的也是记事本)
在这里插入图片描述

那为什么需要文件操作这种东西呢?

有的人想问,这不是找麻烦吗?我直接ctrl + c / v,运行一下,结果显示在屏幕上,这不是很方便吗?整到记事本里面干什么。
其实,文件操作主要是运用于大量数据输入时,可能复制粘贴都得好几秒的那种,屏幕也放不下,那么这个时候用文件操作就很方便啦。

二、怎么实现文件操作?

直接上代码,用注释帮助理解。

具体细节不表
FILE *fp1, *fp2, *fp3;
fp1 = fopen("in.txt", "r");//读
fp2 = fopen("out.txt", "w");//写
/这里进行你的程序读写/
(读入类型一)
fscanf(fp1, "%d%lf", &n, &ft);
fprintf(fp2, "%d%f", n, ft);
(读入类型二)
ch = fgetc(fp1);
fputc(ch, fp2);
(读入类型三)
fgets(s, len, fp1);
fputs(s, fp2);
(关闭文件)
fclose(fp1);
fclose(fp2);
fp3 = fopen("out.txt", "a");//追加
fprintf(fp3, "需要补充在后面的东西****");
(关闭文件)
fclost(fp3);

以上就是就是常用的用法,我们接下来从以下几个方面来读懂这个程序

  1. FILE
  2. fopen和fclose
  3. fscanf和fprintf
  4. fgetc和fputc
  5. fgets和fputs

1.FILE

简单来写,就是下面这样的(不必搞懂里面的细节)

typedef struct {
    char *_ptr; //文件输入的下一个位置
    int _cnt; //当前缓冲区的相对位置
    char *_base; //指基础位置(即是文件的起始位置) 
    int _flag; //文件标志
    int _file; //文件描述符id
    int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
    int _bufsiz; //文件缓冲区大小
    char *_tmpfname; //临时文件名
  }FILE;

所以我们知道,FILE是一个结构体类型,我们定义时
FILE * fp;
其实是定义了一个结构体指针,我们对这个文件指针进行操作时,本质上就对文件进行了操作。

2.fopen和fclose

fopen(“文件名”,文件打开方式);

例如:fp = fopen(“in.txt”, “r”);

说明:(1)该函数有返回值。如果执行成功,函数将返回包含文件缓冲区等信息的FILE结构地址,赋给文件指针fp。否则,返回一个NULL(空值)的FILE指针。
(2)括号内包括两个参数:“文件名”和“文件打开方式”。两个参数都是字符串。“文件名”指出要对哪个具体文件进行操作,一般要指定文件的路径,如果不写出路径,则默认与应用程序的当前路径相同。
在这里插入图片描述

我们只讲解了前三种,大家可以借助于此继续理解其它的方式,我们在此就不多赘述。
不过重点还是放在文本文件(左边一栏),二进制文件用到的情况很少。
fclose(文件指针);.

例如:fclose(fp);

说明:fclose的作用就是关闭文件,至于为什么,我们在前面的介绍中也提到过,如果不及时关闭,可能会出现数据保存不成功的问题。
此外,你需要知道:C语言允许一个程序同时打开多个文件,但是不允许同一文件在关闭前被打开,也就是说,你这一次不关,很有可能导致以后再用这个文件时,就打不开。

3.fscanf和fprintf

fscanf(文件指针,格式字符串,输入表);
fprintf(文件指针,格式字符串,输出表);

例如:
fscanf(fp1, “%d%lf”, &n, &ft);
fprintf(fp2, “%d%f”, n, ft);

说明:其实和scanf和printf差不多,多了一个参数是文件指针。

4.fgetc和fputc

fgetc(文件指针);(返回一个字符);
fputc(字符,文件指针);

例如:
ch = fgetc(fp1);
fputc(ch, fp2);

说明:其实和getchar()和putchar()差不多,多了一个参数是文件指针。

5.fgets和fputs

fgets(字符串首地址,想要读入的字符串长度,文件指针);
fputs(字符串首地址, 文件指针);

例如:
fgets(s, len, fp1);
fputs(s, fp2);

说明 :fgets()比gets()多了两个参数,一个是文件指针,一个是想要读入的长度,意思就是你想读进去几个字符存到字符串里,可以用变量来控制.
fputs()比puts()也就多了一个参数——文件指针。

三、其它的文件操作(摘自教材)

在这里插入图片描述
在这里插入图片描述

结语:虽然还有好多细节没有展示出来,不过那不影响学会使用文件操作,本文的作用就是帮助大家整理这一块的重要知识,学会用,进而形成自己的知识框架。如果要想深入理解,只靠这一篇博客还是不够的,有必要掌握好一些知识,比如说缓冲文件系统,指针等等。希望这篇博客能对大家有所帮助!

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
当在C语言中进行文件操作时,如果输入操作出现乱码,可能是由于以下几个原因导致的。 1. 输入文件的编码与程序读取的编码不匹配。在读取文件时,程序会按照一定的编码规则读取文件中的字符。如果输入文件的编码格式和程序读取的编码格式不同,就会导致读取到的字符乱码。解决此问题的方法是,确保输入文件的编码和程序读取的编码一致。 2. 输入文件包含特殊字符或不可见字符。有些字符可能在文本编辑器中是不可见的,但它们会被读取到并导致乱码。例如,换行符、制表符或其他控制字符等。可以通过在读取文件之前,对文件内容进行过滤或处理,去除这些特殊字符,以避免乱码的出现。 3. 文件读取模式不正确。在使用stdio.h库函数进行文件操作时,需要指定正确的文件打开模式。如果使用错误的模式,可能会导致读取到的内容乱码。比如在只读模式下尝试进行写操作,或者在只写模式下尝试进行读操作等。确保使用适当的文件打开模式,以正确地进行文件操作。 4. 文件路径或文件名包含非ASCII字符。如果文件路径或文件名中包含非ASCII字符,可能导致文件操作出现乱码。此时,需要确保文件路径或文件名的编码格式与程序的编码格式匹配,避免出现乱码。 综上所述,要解决C语言文件操作中输入操作乱码的问题,可以依次判断文件编码是否一致、检查是否存在特殊字符或不可见字符、确认文件读取模式是否正确,并确保文件路径或文件名中没有非ASCII字符等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crer_lu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值