C语言之文件的使用(上)

简介: C语言之文件的使用(上)

前言

我们发现我们所运行的程序,当它运行结束时,输入的数据也会随之销毁。

如果我们希望可以将数据保存下来,在下次运行程序时也可以对上次输入的数据进行应用,我们应该如何操作呢?

本篇内容将向大家介绍如何存储数据之C语言对文件的使用。

预备知识

简单介绍流的概念:

由于每个外部设备的接受和输出数据的接口程序都不相同,所以要将数据在内存和外部设备之间进行传输,就需要一个中间的媒介,对数据进行转化,这个媒介就是流。

一、为什么要使用文件?

我们一般保存数据的方式有:把数据放在磁盘文件、存放在数据库等。

因此如果我们将数据保存在电脑的硬盘上,下次程序运行时就可以使用之前存储的数据了。

二、什么是文件?文件有哪些分类?

简单来说,我们保存在磁盘上的文件就叫文件

文件功能的角度可以将文件分为:程序文件和数据文件。

1.程序文件

包括源程序文件(.c文件),目标文件(windows环境下为.obj文件),可执行程序文件(windows环境下为.exe文件)

2.数据文件

文件的内容不一定是程序,而是文件运行时读写的数据。比如程序运行需要从中读取数据的文件,或者输出内容的文件

当然, 本篇文章主要讨论的是数据文件

三、文件名

文件的唯一标识,方便用户的识别和引用。

文件名包括:文件路径+文件名的主干+文件名的后缀

文件路径分为绝对路径和相对路径

①相对路径:该文件和程序处于同一个路径下,可以直接使用文件名加后缀

②绝对路径:该文件在其他路径下,此时文件路径应该包含全面(eg:文件在桌面上,路径就从桌面开始到文件最终的位置)

四、对文件的操作

1.基础知识(含文件指针的介绍)

1.对文件有哪些操作呢?

打开文件和关闭文件以及对文件内容的读取和写入。

2、如何对一个文件进行操作呢?

通过文件指针

3.文件指针

(准确来说是文件类型的指针)

根据这个结构体类型创建的指针就是文件指针

例如:FILE* pf;

通过文件指针pf可以访问对应的文件

(注意:不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异)

2.文件打开与关闭的相关函数

1.fopen函数

1.fopen(文件名,打开方式)

文件名:同一路径下用相对路径,非同一路径下,用绝对路径

2.打开文件可能成功也可能失败

成功:对文件进行操作。

失败:返回NULL。

3.判断打开失败的原因:

printf(“%s”,strerror(errnor));/perror(“fopen”);
//strerror只返回错误信息;perror即判断错误信息又打印

2.fclose()

关闭文件

fclose(pf);
pf = NULL;//记得将指针置空,避免出现野指针

打开文件要记得关闭文件,原因:

①文件也是资源,系统不能同时打开很多文件

②文件不关闭可能会导致数据的丢失。

文件的打开方式

文件使用方式 含义 如果指定文件不存在
“r”(只读) 为了输入数据,打开一个已经存在的文件文本。 出错
“w”(只写) 为了输出数据,打开一个文本文件 建立一个新的文件
“a”(追加) 向文本文件末尾添加数据 建立一个新的文件
“rb”(只读) 为了输入数据,打开一个二进制文本 出错
“wb”(只写) 为了输出数据,打开一个文件文本。 建立一个新的文件
“ab”(追加) 向二进制文件末尾添加数据 出错
“r+”(读写) 为了读和写,打开一个文本文件 出错
“w+”(读写) 为了读和写,新建一个文本文件 建立一个新的文件
“a+”(读写) 打开一个文件在文件尾进行读写 建立一个新的文件
“rb+”(读写) 为了读和写,打开一个二进制文本文件 出错
“wb+”(读写) 为了读和写,新建一个二进制文本文件 建立一个新文件
“ab+”(读写) 打开一个二进制文本文件,在文件末进行读和写 建立一个新文件

注意:

“w”写文件时,如果文件中原本有数据,会把数据先全部销毁,再写入新的数据;

“w”如果写文件时,连续写了两次,数据不会自动换行,需要自己在写入内容时自己加上“\n”。

“a”在文件原有的内容后面直接加新的数据;

3.文件的顺序读写

1.文件顺序读写的相关函数

文件顺序读写的相关函数

功能 函数名 适用于
字符输入函数 fgetc 所有输入流
字符输出函数 fputc 所有输出流
文本行输入函数 fgets 所有输入流
文本行输出函数 fgets 所有输出流
格式化输入函数 fprintf 所有输入流
格式化输出函数 fscanf 所有输出流
二进制输入函数 fread 文件
二进制输出函数 fwrite 文件

注意:以二进制方式写入(fwrite),就以二进制方式读取(fread)。

(所以对文件内容进行输出时还是需要了解文件内数据的存储形式的)

2.简单对比几个函数

对sscanf和sprintf关系的简单介绍

3.fgetc

读取一个字符的数据(返回所读取的内容)

1.fgetc一次操作读取一个字符(一个字节),读取一个字节后,文件指针后移一个字节的位置。

2.函数返回值

以无符号char强制转换为int的形式返回读取的字符,当文件读取失败或者遇到文件结束都会返回EOF。

4.fgets

读取文件中一行字符的数据,存储到一个数组中(返回该数组的地址)

1.fgets一次操作一行数据,文件指针也是按顺序移动到下一行数据的首地址。

2.函数返回值

如果读取字符成功,该函数返回存储数据的首地址;

如果达到文件末尾或者没有读取到任何字符,str指向的数组内容不变,返回一个空指针NULL;

如果读取时发生错误,读取结束,返回一个空指针NULL。

3.fgets(存放的地址,num,文件) //实际上在读取文件数据时,只读取了num-1个数据,因为系统会在最后一位自动补”\0”作为结束,所以读取文件数据时要自行判断。

彩蛋

任何一个C程序运行起来就默认打开三个流:

1.FIEL*stdin   ---   标准输入流(键盘)

2.FIEL*stdout  ---   标准输出流(屏幕)

3.FIEL*stderr   ---   标准错误流(屏幕)

当然fgetc,fgets,……等函数也可以用于键盘和屏幕,将文件地址换成相对应的stdin和stdout即可正常使用


总结

 以上就是今天要讲的内容,本文简单的介绍了C语言中对于文件使用的相关内容,主要包括文件的基础知识、对文件的打开和关闭的操作以及文件的顺序读写。之后我也会更新相关文章,以补充这部分的知识。

本文的作者也只是一个正在学习C语言等编程知识的萌新,若这篇文章中有哪些不正确的内容,请在评论区向作者指出(也可以私信作者),欢迎大佬们指点,也欢迎其他正在学习C语言的萌新和作者进行交流。

最后,如果本篇文章对你有所启发的话,也希望可以支持支持作者,后续作者也会定期更新学习记录。谢谢大家!


相关文章
|
28天前
|
存储 编译器 C语言
如何在 C 语言中判断文件缓冲区是否需要刷新?
在C语言中,可以通过检查文件流的内部状态或使用`fflush`函数尝试刷新缓冲区来判断文件缓冲区是否需要刷新。通常,当缓冲区满、遇到换行符或显式调用`fflush`时,缓冲区会自动刷新。
|
28天前
|
存储 编译器 C语言
C语言:文件缓冲区刷新方式有几种
C语言中文件缓冲区的刷新方式主要包括三种:自动刷新(如遇到换行符或缓冲区满)、显式调用 fflush() 函数强制刷新、以及关闭文件时自动刷新。这些方法确保数据及时写入文件。
|
1月前
|
C语言
【C语言】探索文件读写函数的全貌(三)
【C语言】探索文件读写函数的全貌
|
1月前
|
存储 C语言
【C语言】探索文件读写函数的全貌(二)
【C语言】探索文件读写函数的全貌
|
1月前
|
C语言
【C语言】探索文件读写函数的全貌(一)
【C语言】探索文件读写函数的全貌
|
1月前
|
存储 文件存储 C语言
【C语言】深入了解文件:简明指南
【C语言】深入了解文件:简明指南
|
2月前
|
Linux C语言
C语言 文件IO (系统调用)
本文介绍了Linux系统调用中的文件I/O操作,包括文件描述符、`open`、`read`、`write`、`lseek`、`close`、`dup`、`dup2`等函数,以及如何获取文件属性信息(`stat`)、用户信息(`getpwuid`)和组信息(`getgrgid`)。此外还介绍了目录操作函数如`opendir`、`readdir`、`rewinddir`和`closedir`,并提供了相关示例代码。系统调用直接与内核交互,没有缓冲机制,效率相对较低,但实时性更高。
|
3月前
|
存储 C语言
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
【C语言】C语言-学生成绩管理系统(源码+数据文件+课程论文)【独一无二】
53 15
|
3月前
|
存储 C语言
【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查
【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查
|
3月前
|
存储 自然语言处理 程序员
【C语言】文件的编译链接和预处理
【C语言】文件的编译链接和预处理