C语言关于文件的操作方法总结

目录
  • 什么是文件
    • 程序文件
    • 数据文件
    • 文件名
  • 为什么要使用文件
  • 文件的操作
    • 文件缓冲区
    • 文件指针(FILE)
    • 文件的打开和关闭
    • fopen
    • fclose
    • 文件的打开方式
    • 流的相关概念
  • 文件的顺序读写
    • fputc
    • fgets

什么是文件

程序文件

其实从文件的功能的角度来说:我们的文件可以分为两种类型的文件:程序文件和数据文件。

就拿我们C语言的程序为例子,包括了程序文件,即后缀为.c的文件;目标文件,即在windows环境下后缀为.obj的文件;可执行程序文件,即后缀为.exe的文件。

数据文件

数据文件,一般指的是用来存储我们在使用应用程序的时候需要读写的数据的文件。

而我们讨论的文件的操作也指的是数据文件的操作。

文件名

文件名通常由三部分组成:

文件路径+文件名主干+文件后缀

为什么要使用文件

我们在运行程序的时候,总会产生一些数据,如果我们不对数据进行存储,那么等待程序结束的时候,数据就会消失。

举个例子:我们上次写过的简易通讯录(简易版通讯录),如果我们这一次运行了这个程序,输入了信息,但是没有对数据进行保存,关闭程序后,下次再次运行程序,就看不到之前的数据了。

而我们想要的是,把通讯录的信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。

而这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据
库等方式。

使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。

文件的操作

文件缓冲区

C语言是使用“缓冲文件系统”来处理文本文件和二进制文件。

缓冲文件系统就是指系统自动地在内存中为程序中每一个正在使用的文件开辟一个“文件缓冲区”、

这个文件缓冲区就相当于一个“中间人”,会在程序数据区和硬盘文件中充当一个过渡者的身份。

文件指针(FILE)

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

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

使用该结构体类型来定义文件指针时,需要包含头文件<stdio.h>。

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

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,
我们作为使用者不必关心细节。

我们一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

FILE* pf;//定义了一个文件指针变量

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

文件的打开和关闭

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

在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。

ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。

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

fopen

该函数包含在<stdio.h>头文件中,用于打开文件的操作。

形参列表列表中的第一个参数是文件的名称,第二个参数是文件的打开方式。

如果打开成功,我们就可以用一个文件指针来接收返回值,用于管理这个文件;如果打开失败,就会返回一个空指针。

因此,我们再接收该函数返回值的时候,应该加上一步检验是否为空指针的操作。

fclose

该函数同样包含在<stdio.h>中

当我们使用完文件的时候,记得要关闭文件。

我们通过fclose函数,并把文件指针作为参数传入即可。

如果关闭成功,该函数就返回0,如果关闭失败,就会返回EOF(-1)。

文件的打开方式

文件有不同的打开方式,不同的打开方式对应着不同的操作。

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

演示:

#include <stdio.h>
int main()
{
	FILE* pFile;
	//打开文件
	pFile = fopen("myfile.txt", "w");
	//文件操作
	if (pFile != NULL)
	{
		fputs("fopen example", pFile);
		//关闭文件
		fclose(pFile);
	}
	return 0;
}

我们会看到,如果使用的是w的打开方式来使用文件的话,程序会在该代码所在源文件的目录下寻找你想要打开的文件,如果文件不存在的话,就会帮自动帮你创建一个。

但是,如果使用的打开方式是r,如果程序发现所在目录不存在该文件,就会出错。

例子如下

int main()
{
	FILE* pFile;
	//打开文件
	pFile = fopen("cmyfile.txt", "r");
	//文件操作
	if (pFile == NULL)
	{
		perror("fopen");
		return -1;
	}

	fputs("fopen example", pFile);
	//关闭文件
	fclose(pFile);
	return 0;
}

当我该源文件的文件夹中,并不存在这个文件时,就会出错,并且我通过了perror这个函数把错误信息打印了出来。

需要注意的是,就像上面栗子那样,只写了文件名.后缀名,会默认在该源文件所在的文件下进行查找,如果需要指定目录,则需要在文件名前面加上文件路径。

例如

#include <stdio.h>
int main()
{
	FILE* pFile;
	//打开文件
	pFile = fopen("c:/program/test/myfile.txt", "w");
	//文件操作
	if (pFile != NULL)
	{
		fputs("fopen example", pFile);
		//关闭文件
		fclose(pFile);
	}
	return 0;
}

注意

在C语言中,如果想要输入路径的话,我们一般使用斜杠(/),而不使用反斜杠(\),因为反斜杠是转义的标志,很有可能你的路径中,刚好存在可以转义的内容,这样就会导致失败。如果要使用反斜杠,就要两条反斜杠连在一起用。

以上就是我们在使用一个文件的时候的基本操作,先要打开文件,然后是对文件进行操作,最后是关闭文件。

流的相关概念

流是个高度抽象的概念,我们可以理解为这就相当于时一条通道,就像水流一样,输入流可以看作一个输入通道,输出流可以看作一个输出通道。

流,这一条通道,连接的是程序和外部设备。

当外部设备需要把数据输入到程序的时候,就需要输入流。

当程序需要把数据输出到外部设备的时候,就需要输出流。

按照我个人的理解

标准输入流,就是连接程序和标准输入设备(键盘)的通道。

标准输出流,就是链接程序和标准输出设备(屏幕)的通道。

文件的顺序读写

顺序读写,顾名思义,就是按照先后顺序来进行读取和写入的操作。

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

fputc

这个函数包含在<stdio.h>中,该函数时一个字符一个字符的输入的。

第一个参数是我们想要输入的字符,第二个参数就是输入流。

我们可以这样理解

我们通过这个函数,把想要输入的字符,放到对应的流中,然后这个流,会把这个字符送到对应的设备上。

如果我们写的是标准输出流,那么就会把数据输出到屏幕上,我们就可以再控制台看见了。

fgets

该函数同样包含在<stdio.h>中,该函数是从流中获得一个字符。

还有剩下的函数,就不一一举例了,使用方法都大同小异。

到此这篇关于C语言关于文件的操作方法总结的文章就介绍到这了,更多相关C语言 文件操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 一篇文章带你了解C语言文件操作中的几个函数

    目录 总结 fopen:有两个参数,第一个是要被打开或者被创建的文件名,第二个是以什么方式打开.这两个参数要分别用双引号括起来 打开文件和关闭文件的基本流程,关闭文件之后要置空 fwrite:有四个参数,第一个是指向要被写入的数据的指针,这里是a的地址:第二个参数是被写入项的大小,单位是字节,这里是a的大小:第三个参数是要被写入的项的个数,这里是1,意思是写入一个a:最后一项是FILE结构的指针,这里是pf.这四个参数不需要双引号. 文件指针:. 每个被使用的文件都在内存中开辟了一个相应的文件信

  • 详解C语言之文件操作(上)

    目录 什么是文件 程序文件 数据文件 文件名 文件类型 文件缓冲区 文件指针 文件的打开和关闭 输入和输出 总结 什么是文件 磁盘上的文件就是文件. 在程序设计中,我们一般谈的文件有两种:程序文件和数据文件 程序文件 包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe). 数据文件 文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行时需要从中读取数据的文件,或者输出内容的文件. 文件名 文件名包含三部分:文件路径.

  • 详解C语言之文件操作下)

    目录 文件的随机读写 fseek函数 ftell函数 rewind函数 文件结束判定 feof函数和ferror函数 总结 文件的随机读写 之前的函数只能实现顺序读写,而实现随机读写需用fseek函数来定位--根据文件指针的位置和偏移量来定位文件指针 fseek函数 int fseek(FILE* stream, long int offset, int origin); 返回值:若成功返回0,则返回非0值. 参数:stream为文件指针,offset为偏移量.origin为起始位置,有三种 S

  • C语言文件操作详解

    目录 一.什么是文件 二.文件缓冲区 三.文件指针 四.文件的打开和关闭. 总结 一.什么是文件 在程序设计中,我们一般谈的文件有两种:程序文件.数据文件. 程序文件: 包括源程序文件(后缀为.c ),目标文件( windows环境后缀为.obj ) ,可执行程序( windows环境后缀为.exe ). 数据文件: 文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件 或者输出内容的文件. 数据文件又分为"文本文件"和"二级制文件"

  • C语言中炫酷的文件操作实例详解

    目录 什么是文件 程序文件 数据文件 (本文重点) 文件名 文件的打开和关闭 文件指针 文件函数 相对路径与绝对路径 输入输出流 二进制读写 fwirte fread 总结 什么是文件 磁盘上的文件是文件 但是在程序设计中,我们一般谈的文件有两种:程序文件和数据文件(从文件功能的角度来分类). 程序文件 包括源程序文件(例如.c文件)目标文件(windows环境后缀为.obj)可执行程序(windos环境后缀为exe). 数据文件 (本文重点) 文件的内容不一定是程序,而是程序运行时读写的数据,

  • c语言简单实现文件 r/w 操作方法

    数据的输入和输出几乎伴随着每个 C 语言程序,所谓输入就是从"源端"获取数据,所谓输出可以理解为向"终端"写入数据.这里的源端可以是键盘.鼠标.硬盘.光盘.扫描仪等输入设备,终端可以是显示器.硬盘.打印机等输出设备.在 C 语言中,把这些输入和输出设备也看作"文件". 文件及其分类 计算机上的各种资源都是由操作系统管理和控制的,操作系统中的文件系统,是专门负责将外部存储设备中的信息组织方式进行统一管理规划,以便为程序访问数据提供统一的方式. 文件

  • C语言基础文件操作方式超全详解建议收藏

    目录 什么是文件 文件名 文件类型 文件指针 文件的打开与关闭 打开方式 文件的顺序读写 关于fread的返回值 对比一组函数 文件随机读取 文件结束判断 perror() ferror() 什么是文件 磁盘上的文件是文件. 在程序设计中,我们一般读的文件有两种:程序文件 和 数据文件 程序文件包括源程序文件(后缀为.c).目标文件(win下后缀为 .obj).可执行文件(win下环境后缀为.exe) 数据文件:文件的内容不一定是程序,而是运行时读写的程序,比如程序运行需要从中读取数据的文件,或

  • C语言文件操作零基础新手入门保姆级教程

    目录 一.前言 二.文件操作基础知识 ①什么是文件 ②数据文件类型 ③数据如何存储 ④如何读取二进制文件 ⑤什么是文件名 ⑥文件缓冲区 ⑦文件指针 三.文件操作函数 ①fopen 与 fclose ②fputc与fgetc ③fputs与fgets ④fprintf与fscanf ⑤fwrite与fread ⑥fseek与ftell与rewind ⑦ferror与feof ⑧补充函数 sscanf sprintf ⑨补充函数perror  strerror 总结 一.前言 我们如何使我们设计的程

  • C语言关于文件的操作方法总结

    目录 什么是文件 程序文件 数据文件 文件名 为什么要使用文件 文件的操作 文件缓冲区 文件指针(FILE) 文件的打开和关闭 fopen fclose 文件的打开方式 流的相关概念 文件的顺序读写 fputc fgets 什么是文件 程序文件 其实从文件的功能的角度来说:我们的文件可以分为两种类型的文件:程序文件和数据文件. 就拿我们C语言的程序为例子,包括了程序文件,即后缀为.c的文件:目标文件,即在windows环境下后缀为.obj的文件:可执行程序文件,即后缀为.exe的文件. 数据文件

  • C语言和go语言之间的交互操作方法

    一.go代码中使用C代码 go代码中使用C代码,在go语言的函数块中,以注释的方式写入C代码,然后紧跟import "C" 即可在go代码中使用C函数 代码示例: go代码:testC.go package main /* #include <stdio.h> #include <stdlib.h> void c_print(char *str) { printf("%s\n", str); } */ import "C"

  • Python网页正文转换语音文件的操作方法

    天气真的是越来越冷啦,有时候我们想翻看网页新闻,但是又冷的不想把手拿出来,移动鼠标翻看.这时候,是不是特别想电脑像讲故事一样,给我们念出来呢?人生苦短,我有python啊,试试用 Python 来朗读给你听吧. 网页转换成语音,步骤无外乎: 网页正文识别,获取到正文的文本内容: 文本转语音,通过接口将文本转换成语音文件: 语音文件的发声,即将语音文件读出: 1 网页正文识别 之所以用 Python,就是因为 Python 有着丰富的库,网页正文识别也不在话下.这里用 readability.go

  • Rust应用调用C语言动态库的操作方法

    目录 外部功能接口FFI UDP套接字的读超时 Rust调用C语言动态库中的函数 避免重复造轮子,使用Rust官方C语言库 外部功能接口FFI 虽然高级(脚本)编程语言的功能丰富,表达能力强,但对底层的一些特殊操作的支持并不完善,就需要以其他编程语言来实现.调用其他编程语言的接口,被称为Foreign Function Interface,直译为外部功能接口.该接口通常是调用C语言实现的外部功能模块,因为C语言接近于全能,几乎任何功能都能够实现:正如同使用汇编语言也可以实现很多功能一样,但开发效

  • go语言检测文件是否存在的方法

    本文实例讲述了go语言检测文件是否存在的方法.分享给大家供大家参考.具体分析如下: go语言检测文件是否存在,首先创建一个FileInfo,如果不报错,再通过 IsDir()检查是否是目录 复制代码 代码如下: finfo, err := os.Stat("filename.txt") if err != nil {     // no such file or dir     return } if finfo.IsDir() {     // it's a file } else

  • go语言实现文件分割的方法

    本文实例讲述了go语言实现文件分割的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: import (  // "bufio"  "flag"  "fmt"  "io"  "os" ) import "strconv" var infile *string = flag.String("f", "Null", "ple

  • Go语言判断文件或文件夹是否存在的方法

    本文实例讲述了Go语言判断文件或文件夹是否存在的方法.分享给大家供大家参考,具体如下: Golang 判断文件是否存在有点怪异,是根据在操作文件时返回的错误信息来判断的,而不能直接根据路径判断 版本1: 复制代码 代码如下: func IsExists(path string) (bool, error) {     _, err := os.Stat(path)     if err == nil {         return true, nil     }     if os.IsNot

  • Go语言清除文件中空行的方法

    本文实例讲述了Go语言清除文件中空行的方法.分享给大家供大家参考.具体实现方法如下: 这里使用Go语言读取源文件,去掉空行,并写到目标文件 复制代码 代码如下: /**  * Created with IntelliJ IDEA.  * User: hyper-carrot  * Date: 12-8-31  * Time: 下午4:04  * To change this template use File | Settings | File Templates.  */ package ma

  • go语言对文件按照指定块大小进行分割的方法

    本文实例讲述了go语言对文件按照指定块大小进行分割的方法.分享给大家供大家参考.具体如下: 复制代码 代码如下: import (  // "bufio"  "flag"  "fmt"  "io"  "os" ) import "strconv" var infile *string = flag.String("f", "Null", "

  • C语言实现文件内容按行随机排列的算法示例

    本文实例讲述了C语言实现文件内容按行随机排列的算法.分享给大家供大家参考,具体如下: 在实际工作上有种需求, 就是需要从给定的数据里,随机抽取一部分. 有一种简单的方法是根据总的数据条数和要抽取的数据条数, 通过简单方法,隔几行取一个,这样也能达到随机抽取一部分的目的. 但这样,源数据是顺序的,则抽取的数据也是顺序的,不满足一些情境. 这里实现的功能是: 将全部数据,按行重新随机排列, 这样从结果头部选几行,就是随机抽取的几行了,比较方便. 实现的思路:  对于N行的数据, 给每一行用[1-N]

随机推荐