【C/C++】万字图文详解C语言文件操作 完美装饰课设大作业(上)

简介: 【C/C++】万字图文详解C语言文件操作 完美装饰课设大作业

目标导航


写在前面

为什么使用文件?

什么是文件?

程序文件

数据文件

认识文件名

文件的打开和关闭

文件指针

文件的打开和关闭

1.以"r"(只读)的方式打开文件

2.以"w"(只写)的方式打开文件

3.以"a"(追加)的方式打开文件

文件的顺序读写

输入流与输出流的概念

fputc & fgetc

fputs & fgets

fscanf & fprintf

文件的随机读写

fseek

ftell

rewind

文本文件和二进制文件

文件读取结束的判定

被错误使用的feof

文件缓冲区


写在前面


在完成某项课设大作业时,我们的老师可能要求我们将内存中存储的数据保存到文件里,方便随用随取。本章详细介绍了文件一系列操作:文件的打开与关闭、文件的读与写等,以及拓展知识:文件缓冲区的介绍等。掌握了文件操作不仅能使我们的程序设计锦上添花,还能让我们对程序设计以及计算机有更深层次的了解。


正文


为什么使用文件?


当我们写了一个简单的小游戏或者是一个班级信息管理系统,又或是通信录等需要存储数据的程序,在程序运行时,我们保存进去很多信息,例如游戏的对局记录、班级人员信息、联系人信息等。我们对这些信息经过一系列增删查改操作后,此时信息被保存到了内存中。当关闭程序,再次打开程序后,令人揪心的事发生了,我们上次保存的数据不见了,那就在录入一遍吧.......首先我们得知道关闭程序后数据为什么会丢失。因为这些数据都保存在内存中,程序结束后这些内存会被释放归还给操作系统。为了避免数据的丢失,我们在关闭程序前可以将内存中的数据保存磁盘上或者数据库中以使数据持久化。而使用文件,我们就可以很好的将数据保存在磁盘中。


什么是文件?


12.png

在磁盘中保存的就是文件,但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。


程序文件


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

(windows环境后缀为.exe)


数据文件


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

以前各章所处理数据的输入输出都是以终端(例如printf、scanf)为对象的, 即从终端的键盘输入数据,运行结果显示到显示器上。其实有时候我们会把信息输出到磁盘上,当需要的

时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。


本章节讨论的就是数据文件。


认识文件名


一个文件要有一个唯一的文件标识,以便用户识别和引用。

文件名包含3部分:文件路径+文件名主干+文件后缀

例如:c:\code\test.txt

13.png


为了方便起见,文件标识常被称为 文件名 


文件的打开和关闭


文件指针


缓冲文件系统中,关键的概念是 “文件类型指针 ” ,简称 “文件指针 ” 。

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的

名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是

有系统声明的,取名 FILE 。

例如,VS2013编译环境提供的 stdio.h 头文件中有以下的文件类型申明:


struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
       };
typedef struct _iobuf FILE;


不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。下面我们可以创建一个FILE*的指针变量:

FILE* pf;//文件指针变量

定义pf是一个指向FILE类型数据的指针变量。 可以使pf指向某个文件的文件信息区 (是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。 也就是说,通过文件指针变量能够找到与它关联的文件。

14.png


文件的打开和关闭


文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。

在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当

于建立了指针和文件的关系。ASCII 规定使用fopen函数来打开文件,fclose来关闭文件。


1. //打开文件
2. FILE * fopen ( const char * filename, const char * mode );
3. //关闭文件
4. int fclose ( FILE * stream )

113.png

让我们创建一个项目实际操作一下吧。

112.png

写代码:


#include<stdio.h>
int main()
{
  //打开文件
  //相对路径
  //FILE* pf = fopen("test.txt", "w");
  //绝对路径
  FILE* pf = fopen("D:\\2022\\2022_c\\test_11_25\\test.txt", "w");
  if (pf == NULL)
  {
    perror("fopen");
    exit(-1);
  }
  //写文件
  //......
  //关闭文件
  fclose(pf);
  pf = NULL;
  return 0;
}

接下来对代码的每一步进行解释:

77.png

打开文件时有两种方式:相对路径和绝对路径

相对路径:在当前源程序(.c)文件所在的路径下的某个文件。

绝对路径:任意路径下的文件。


78.png

fopen并非每次都能成功地打开文件。打开成功则返回指向该文件的文件信息区的指针;打开失败则返回NULL。 所以使用pf前必须加以判断。

79.png

free的原理相同,fclose关闭文件后,pf指向的地址不再有效,为了避免不小心再次使用,需将其置为NULL。以上代码中的"w",指一种文件的打开方式,含义为“只写”的方式打开。除了"w"之外,还有许许多多的打开方式,如下:

文件使用方式

      含义

如果指定文件不存在


“r”(只读)

为了输入数据,打开一个已经存在的文本文件

出错

“w”(只写)

为了输出数据,打开一个文本文件

建立一个新的文件

“a”(追加)

向文本文件尾添加数据

建立一个新的文件

“rb”(只读)

为了输入数据,打开一个二进制文件

出错

“wb”(只写)

为了输出数据,打开一个二进制文件

建立一个新的文件

“ab”(追加)

向一个二进制文件尾添加数据

出错

“r+”(读写)

为了读和写,打开一个文本文件

出错

“w+”(读写)

为了读和写,建议一个新的文件

建立一个新的文件

“a+”(读写)

打开一个文件,在文件尾进行读写

建立一个新的文件

“rb+”(读写)

为了读和写打开一个二进制文件

出错

“wb+”(读写)

为了读和写,新建一个新的二进制文件

建立一个新的文件

“ab+”(读写)

打开一个二进制文件,在文件尾进行读和写

建立一个新的文件

接下来我们就简单认识一下前三个打开方式。


1.以"r"(只读)的方式打开文件


FILE* pf = fopen("test.txt", "r");

以只读的方式打开文件,只能从文件里读取数据,而不能写如数据或者修改数

如果找到该文件,则返回指向该文件的文件信息区的FILE类型的指针;

如果未找到,则返回NULL。


2.以"w"(只写)的方式打开文件


FILE* pf = fopen("test.txt", "w");

以只写的方式打开文件,只能写入数据到文件中,而不能读取文件数据

如果未找到该文件,则在该路径下创建该文件并返回指向该文件的文件信息区的指针;

如果找到该文件,则丢弃该文件中的内容,视其为新的空文件,并返回指向该文件的文件信

息区的指针。


3.以"a"(追加)的方式打开文件


FILE* pf = fopen("test.txt", "a");

以追加的方式打开文件,含义为在该文件的末尾打开文件进行写入

如果未找到该文件,则在该路径下创建该文件并返回指向该文件的文件信息区的指针;

如果找到该文件返回指向该文件的文件信息区的指针。


学会了如何打开和关闭文件之后,我们来看看如何进行文件的读与写。


目录
相关文章
|
2月前
|
安全 编译器 C语言
C++入门1——从C语言到C++的过渡
C++入门1——从C语言到C++的过渡
72 2
|
1月前
|
C语言 Windows
C语言课设项目之2048游戏源码
C语言课设项目之2048游戏源码,可作为课程设计项目参考,代码有详细的注释,另外编译可运行文件也已经打包,windows电脑双击即可运行效果
34 1
|
24天前
|
算法 编译器 C语言
【C语言】C++ 和 C 的优缺点是什么?
C 和 C++ 是两种强大的编程语言,各有其优缺点。C 语言以其高效性、底层控制和简洁性广泛应用于系统编程和嵌入式系统。C++ 在 C 语言的基础上引入了面向对象编程、模板编程和丰富的标准库,使其适合开发大型、复杂的软件系统。 在选择使用 C 还是 C++ 时,开发者需要根据项目的需求、语言的特性以及团队的技术栈来做出决策。无论是 C 语言还是 C++,了解其优缺点和适用场景能够帮助开发者在实际开发中做出更明智的选择,从而更好地应对挑战,实现项目目标。
46 0
|
2月前
|
C语言 C++
C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
68 10
|
3月前
|
算法 机器人 C语言
ROS仿真支持C++和C语言
ROS仿真支持C++和C语言
97 1
|
2月前
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
29 0
|
4月前
|
编译器 Linux C语言
【C++小知识】为什么C语言不支持函数重载,而C++支持
【C++小知识】为什么C语言不支持函数重载,而C++支持
|
4月前
|
存储 编译器 C语言
C++内存管理(区别C语言)深度对比
C++内存管理(区别C语言)深度对比
85 5
|
3月前
|
编译器 C语言 C++
从C语言到C++
本文档详细介绍了C++相较于C语言的一些改进和新特性,包括类型检查、逻辑类型 `bool`、枚举类型、可赋值的表达式等。同时,文档还讲解了C++中的标准输入输出流 `cin` 和 `cout` 的使用方法及格式化输出技巧。此外,还介绍了函数重载、运算符重载、默认参数等高级特性,并探讨了引用的概念及其应用,包括常引用和引用的本质分析。以下是简要概述: 本文档适合有一定C语言基础的学习者深入了解C++的新特性及其应用。
|
5月前
|
程序员 编译器 C语言
云原生部署问题之C++中的nullptr相比C语言中的NULL优势如何解决
云原生部署问题之C++中的nullptr相比C语言中的NULL优势如何解决
57 10