C语言文件操作的基础应用(超详细)(一)

简介: C语言文件操作的基础应用(超详细)

前言


在以前我们写的代码,无论运行时在内存中存储了多少的数据,当我们将执行文件关闭,再次打开后所存的数据也都会消失不见。试想当下的软件跟应用可有不能进行存储的功能吗?所以将我们所写的代码导入文件之中,便显得相当重要。于是就有了今天所讲的文件操作。这样我们就可以将数据直接存放在电脑的硬盘上,做到数据的持久化。

什么是文件


一般说的文件包括两种:数据文件跟程序文件。

数据文件


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

后缀为.exe)。

程序文件


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

或者输出内容的文件。

文件指针


每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名 FILE

在VS2022中 FILE 的定义是这样的:

image.png

而在VS2013则是如此:

image.png

可见不同的编译器下 FILE 类型包含的内容虽然有些许不同但还是相同的使用方法,于操作者而言并不需要了解太多具体细节。

fopen


如果说 malloc calloc 是动态内存存在的基础,那文件操作失去了 fopen 就失去了操作的基础

在Cplusplus上进行查找。

image.png

我们知道了其包含在 stdio.h 里面返回一个 FILE* 类型的数据,需要传入的参数有两个,一个是 const char* 类型的文件名,第二个是文件的打开方式。同时两者都代表的是字符串所以在使用的时候一定要注意双引号的使用。

文件名


我们先来讲第一个参数,仔细看关于这个参数的说明,这个字符串包含了要打开字符串的名字,如果系统支持的话可以写上文件的整个路径否则默认在当下文件夹内查询。在文件名后还要加上文件格式否则会出现文件识别错误或是创建出的文件的格式并不是我们想要的。所以在编写代码是时候需要十分注意。

image.png

打开方式


文件的打开方式有多种:如只读的 r 只写的 w 用于追加数据的 a ,以及读写的 r+w+ a+ 还有打开二进制文件的 rbwb 以及 ab 。甚至还有打开二进制进行读写的 rb+wb+ ab+

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

具体打开方式的区别我们留着后面讲。但是值得注意的一件事是用含 r ab 打开方式如果查询不到指定文件则会返回一个空指针。为了避免出现错误,我们必须对 fopen 的返回值进行检查,如果正常才能让函数继续进行。

fclose


作用相当于动态内存中的 free ,只需传入前面打开文件时接收的指针用于关闭文件。与 free 相似关闭文件后前面 FILE* 类型的指针就变成了野指针,所以我们还需要讲该指针置空才能保证在往后的程序之中不会出现错误。

image.png

image.png

文件的读写


打开文件后我们需要想要将数据从内存输出到文件或是从文件将数据输入进内存,都需要使用特定的库函数来实现。同时对于文件的读写还分作顺序读写跟随机读写。

顺序读写


fputc


作为一个用于将数据写入文件的函数,fputc需要传递的参数是要写入的字符以及目标文件的文件指针。写入成功则返回所写的字符,若发生错误则返回EOF。同时会使文件指针加一,指向下一个区域。

image.png

根据语法,我们打出了这样的程序,打开一个叫 test 格式为 txt 的文件后将一个字符 a 输出到文件上。

image.png

将程序运行之后,由于没有这个文件所以在当下文件夹自动建立了一个叫 test 的文本文件。

image.png

打开这个文件后我们可以发现里面写入的就是 a 。说明我们的代码并没有出错,这个库函数确实能够将我们想要的数据输入到文件之中。

49a424f5ecfe4d198627530204d70343.png

同时根据其每次输入都会移动文件指针的特性,我们还可以这样子写,就完成了26个字符的输出。

image.png

fgetc


该函数为字符输入函数,需要传入一个 FILE* 的类型的指针之后返回一个整型,该整型为所读字符所代表的 ASCII 码值,若是读取失败则返回 EOF

image.png

每次读取成功后文件指针都会往后移动一位,使得下次读取的便是下一个字符。

image.png

由于该函数一次只能读取一个字符所以即便我们后面还有很多内容也只能读取第一个字符。

image.png

根据其特性,只要进行多次读取就可以将文件内的全部内容读出。

image.png

fputs


fputs为文本行输入的函数,输入一个字符串并将其写入文件中。

image.png

直到遇到 \0 才结束读取,即便遇到 \n 也会继续读取并将文本数据换行。输出成功则会返回一个非 0 值。

image.png

image.png

fgets


fgets fput 就是一对,一个是输入一个是输出且目标都是字符串,不过 gets 需要传入一个参数来表示一共需要读取多少个字符。并且读到 \n \0 会停止读取,同时将 \n 复制到读出的字符串中

image.png

所以若将之前输入进去的数据再打印出来,便只会截至到\n而停止。

image.png

image.png

可以看到fgets还会将 \0 一并拷贝到目标数组之中,所以实际上读取到的字符数会比我们传入的那个参数要少 1 。并且读取成功后返回指向目标字符串的指针。

image.png

目录
相关文章
|
5月前
|
C语言
C语言中条件操作符的应用
最后,条件操作符是个超级英雄,但不是每个代码问题都需要一个超级英雄来解决。一定要在适当的时候适度的使用它,那么它将成为你的编程工具箱中的一件强力工具。
302 75
|
3月前
|
存储 编译器 程序员
c语言的文件操作与文件缓冲区
如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。磁盘(硬盘)上的文件是文件。但是在程序设计中,我们⼀般谈的⽂件有两种:程序文件、数据文件(从文件功能的角度来分类 的)。就比如说我们电脑中以.txt为后缀的就是文件的一种,他就是数据文件。.exe为后缀的就为程序文件。函数名功能适用范围fgetc字符输入函数所有输入流fputc字符输出函数所有输出流fgets。
96 0
|
8月前
|
存储 小程序 C语言
【C语言程序设计——文件】文件操作(头歌实践教学平台习题)【合集】
本文介绍了C语言中的文件操作,分为两个关卡。第1关任务是将键盘输入的字符(以#结束)存入`file1.txt`并显示输出;第2关任务是从键盘输入若干行文本(每行不超过80个字符,用-1作为结束标志),写入`file2.txt`后再读取并显示。文中详细讲解了文件的打开、读取(使用`fgetc()`和`fgets()`)、写入(使用`fputc()`和`fputs()`)及关闭操作,并提供了示例代码和测试说明。
229 5
|
9月前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
256 9
|
9月前
|
存储 数据管理 C语言
C 语言中的文件操作:数据持久化的关键桥梁
C语言中的文件操作是实现数据持久化的重要手段,通过 fopen、fclose、fread、fwrite 等函数,可以实现对文件的创建、读写和关闭,构建程序与外部数据存储之间的桥梁。
|
10月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
262 5
|
10月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
10月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
10月前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
591 3
|
10月前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
222 2