C语言文件操作实现数据持久化(帮你快速了解文件操作函数)

目录
  • 一.了解文件
    • 1.文件主要功能
    • 2.什么是文件
  • 二.文件的打开和关闭
    • 1.文件指针
    • 2.文件的打开和关闭
    • 2.关闭文件函数
  • 三.顺序读写文件函数
    • fputc字符输入函数
    • fgetc字符输入函数
    • fputs文本行输出函数
    • fgets文本行输入函数
    • fprintf格式化输出函数
    • fscanf格式化输入函数
    • fwrite二进制输出函数
    • fread二进制输入函数
  • 四. 解析上述的流
  • 五.文件的随机读写
    • fseek
    • ftell
    • rewind
  • 总结

一.了解文件

1.文件主要功能

  • 使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。
  • 在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显 示器上。
  • 其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理 的就是磁盘上文件。

2.什么是文件

磁盘上的文件是文件。

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

2.1程序文件

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

2.2数据文件

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

 2.3 文件名

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

比如: c:\code\test.txt

二.文件的打开和关闭

以下所有讲的函数头文件都是:#include <stdio.h>

1.文件指针

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

我们可以创建一个FILE*的指针变量:

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

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

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

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

2.文件的打开和关闭

1.打开文件函数:

代码演示:

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

文件名:

文件名分为两种形式:

1.绝对路径

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

2.相对路径

文件名主干+文件后缀(也可以不加后缀)

相对路劲是在当前程序文件的文件夹下,去查找

文件的打开方式:

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

返回:

正确代码书写:

//打开文件
	FILE *pf = fopen("test.txt", "w");
	//文件是有可能打开失败的,文件名出错,打开方式问题等
	if (NULL == pf)
	{
		perror("fopen");
		return;
	}

只有打开文件就一定要搭配上判断

2.关闭文件函数

代码演示:

fclose(pf);

正确的代码规范:

int main()
{
	//打开文件
	FILE *pf = fopen("test.txt", "w");
	//文件是有可能打开失败的,文件名出错,打开方式问题等
	if (NULL == pf)
	{
		perror("fopen");
		return;
	}

	//写文件
	//……

	//关闭文件
	fclose(pf);
	pf = NULL;//防止再次使用此指针

	return 0;
}

三.顺序读写文件函数

  • 这里的输入是指把文件的数据输入到程序内存中
  • 输出指的是内存中的数据,输出到文件中

站在程序内存的角度,把文件想成平时打印的cmd黑框就好

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

fputc字符输入函数

函数原型:

补充:输入流是什么 后面讲现在你们看一下代码就懂

函数代码: 

这是我当前文件下的一些文件,我讲利用打开方式自动创建一个文件

运行程序前的文件夹:

代码:

#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	int i = 0;
	for (i = 0; i < 26; i++)
	{
		fputc('a' + i, pf);//写入26个字母
	}

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

运行程序前的文件夹:

你们可以去看看是不是跟我打开的文件夹名相同,而且已经在里面写入了26个字母:

返回:

函数正常执行返回所写数据,字符返回对应ASII码值

发生写入错误返回EOF

fgetc字符输入函数

函数原型

返回:

函数正常执行返回所写数据,字符返回对应ASII码值

发生写入错误返回EOF

代码:

我会读取刚刚fgetc输入到文件中的数据

注意:我打开方式的变化

#include<stdio.h>int main(){//打开文件FILE* pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen");return 1;}//读文件int ch;while ((ch = fgetc(pf)) != EOF){printf("%c ", ch);}//关闭文件fclose(pf);pf = NULL;return 0;}

fgetc读取了一个字符会自动向后移动一位

结果:

fputs文本行输出函数

函数原型:

返回:

代码:

一次输出一行

#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fputs("hallo\n", pf);
	fputs("word", pf);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

结果:

有此可见转意字符\n等也是可以操作的

补充:因为文件方式的原因会把之前的数据覆盖掉,成为新的数据如果想不覆盖要用追加的方式打开,我现在把打开方式改为追加执行

#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "a");//注意我把打开方式改为了追加a
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fputs("hallo\n", pf);
	fputs("word", pf);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

结果:

还有一个二进制的追加ab,其余打开方式请自行去查看上面的表格

fgets文本行输入函数

函数原型:

返回:

代码:

一次输入一行

#include<stdio.h>
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	char arr[] = "#######################";//用来观察一下的字符串

	fgets(arr, 20, pf);
	printf("%s", arr);//注意我这里没有加\n因为之前的输入里面是输入进去了\n的
	fgets(arr, 20, pf);
	printf("%s", arr);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

注意我这里没有加\n因为之前的输入里面是输入进去了\n的

结果:

fprintf格式化输出函数

函数原型:

可以发现只是多了一个参数其余并没有变化

返回:

代码:

格式化输出数据到文件中

#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float scores;
};

int main()
{
	//打开文件
	struct S s = { "Laoli" ,20 ,95.5f };

	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fprintf(pf, "%s %d %f\n", s.name, s.age, s.scores);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

这个字符在输出字符串时遇到空格也会正常输出

结果:

fscanf格式化输入函数

函数原型: 

 返回:

代码:

把刚刚放进文件的数据格式化拿出来

#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float scores;

};

int main()
{
	//打开文件
	struct S s = { 0 };
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.scores));
	printf("%s %d %f", s.name, s.age, s.scores);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

结果:

这个函数在遇到空格会停止输入所有项,例如在Laoli中间加上空格:Lao li

fwrite二进制输出函数

函数原型: 

这个函数是以二进制的方式进行输出的

 返回:

 代码:

#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float scores;

};

int main()
{
	//打开文件
	struct S s = { "Laoli" ,20 ,95.5f };

	FILE* pf = fopen("test.txt", "wb");//注意我已经改变了文件的打卡方式
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	fwrite(&s, sizeof(struct S), 2, pf);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return

注意我已经改变了文件的打卡方式

结果:

大家可以看到除了字符串什么都看不懂呀,这个烫烫烫烫烫烫是什么鬼呀,其实是因为二进制的形式存储的,计算机可以看懂就可以了,也可以利用fread函数查看内容

fread二进制输入函数

函数原型:

返回:

代码:

读取刚刚存入文件的数据,以二进制形式读取

#include<stdio.h>
struct S
{
	char name[20];
	int age;
	float scores;

};

int main()
{
	//打开文件
	struct S s = { 0 };

	FILE* pf = fopen("test.txt", "rb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	//读文件
	fread(&s, sizeof(struct S), 1, pf);
	printf("%s %d %f", s.name, s.age, s.scores);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

结果:

四. 解析上述的流

以上函数都是在文件流中拿信息,是需要fopen函数来打开的文件流

还几个默认打开的流:

代码:

五.文件的随机读写

其实这些函数也并不是随机的,也是有规律的,但不再是从开头到结尾了

fseek

函数原型:

偏移量(字节为单位):

向右移动用正数,向左移动用负数

起始位置设置:

 返回:

代码:

我手动的在文件中添加这样的数据:

从末尾移动三位取出数据:

#include<stdio.h>

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "rb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}

	fseek(pf, -3, SEEK_END);
	int ch = fgetc(pf);
	printf("%c\n", ch);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

ftell

功能:返回文件指针相对于起始位置的偏移量

函数原型:

返回: 

成功返回当前位置

代码:

我们就用刚刚的代码加上函数试一下:

#include<stdio.h>

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "rb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}

	fseek(pf, -3, SEEK_END);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	int pos = ftell(pf);
	printf("%d", pos);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

结果:

分析:

rewind

功能:让文件指针的位置回到文件的起始位置

函数原型:

代码:

#include<stdio.h>

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "rb");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}

	fseek(pf, -3, SEEK_END);
	int ch = fgetc(pf);
	printf("%c\n", ch);

	rewind(pf);//回到文件的起始位置
	int pos = ftell(pf);
	printf("%d", pos);

	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

结果:

这个函数非常简单不做过多介绍了

此片文章设计大量函数,记不住很正常,收藏一波需要的时候来查一查。

总结

到此这篇关于C语言文件操作实现数据持久化(帮你快速了解文件操作函数)的文章就介绍到这了,更多相关C语言文件操作数据持久化内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言文件操作函数大全(超详细)

    fopen(打开文件)相关函数 open,fclose表头文件 #include<stdio.h>定义函数 FILE * fopen(const char * path,const char * mode);函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态.mode有下列几种形态字符串:r 打开只读文件,该文件必须存在.r+ 打开可读写的文件,该文件必须存在.w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失.若文件不存在则建立该文件.w

  • C语言文件操作函数freopen详细解析

    今天做USACO  用到了文件的操作. 之前做USACO只是格式化的些 写  freopen("xxx.in","r",stdin)  和"freopen("xxx.out","w",stdout)" 百度百科上是这么介绍的: 函数名: freopen 功 能: 替换一个流,或者说重新分配文件指针,实现重定向.如果stream流已经打开,则先关闭该流.如果该流已经定向,则freopen将会清除该定向.此函数

  • C语言常见的文件操作函数

    目录 一.文件的打开和关闭 1.文件指针 2.文件打开和关闭 二.文件的顺序读写 1.fgetc()和fputc()函数 2.fgets()和fputs()函数 3.fscanf()和fprintf()函数 4.fread()和fwrite()函数 三.文件的随机读写 1.fseek函数 2.ftell函数 3.rewind函数 四.文本文件和二进制文件 五.文件读取结束的判定 六.文件缓冲区 总结 一.文件的打开和关闭 1.文件指针 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存

  • C语言文件操作之fread函数详解

    目录 前言 一.fread 函数 二.缓冲区受限的情况 ( 循环读取文件 | feof 函数判定文件读取完毕 ) 三.处理乱码问题 四.记录读取的字节个数 五.读取到 0 字节的情况 六.读取完毕的情况 七.读取文本文件 “\n” 与 读取二进制文件 “\r\n” 区别 总结 前言 二进制文件读写两个重要的函数 , fread 和 fwrite , fread 用于读取文件 , fwrite 用于写出文件 ; fread / fwrite 函数 既可以操作 二进制文件 , 又可以操作 文本文件

  • C语言文件操作中 fgets与fputs 函数详解

    C语言文件操作中 fgets.fputs 函数详解 先给出api fgets 语法: #include <stdio.h> char *fgets( char *str, int num, FILE *stream ); 函数fgets()从给出的文件流中读取[num - 1]个字符并且把它们转储到str(字符串)中. fgets()在到达行末时停止,在这种情况下,str(字符串)将会被一个新行符结束. 如果fgets()达到[num - 1]个字符或者遇到EOF, str(字符串)将会以nu

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

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

  • C语言文件操作与相关函数介绍

    目录 1.操作的准备 2.文件的打开 3.文件的使用方式 4.相关的函数 4.1 fputc 4.2 fgetc 4.3 fputs 4.4 fgets 4.5 fprintf 4.6 fscanf 4.7 fwrite 4.8 fread 1.操作的准备 c语言中的文件操作相关函数的头文件都是在#include<stdio.h>里 除此之外还得定义一个文件指针对目标文件进行指向操作,一般形式为:FILE *指针变量名; 例如:FILE *fp 2.文件的打开 对于数据的处理一般有两种存放形式

  • Python将一个CSV文件里的数据追加到另一个CSV文件的方法

    在做数据处理工作时,有时需要将数据合并在一起,本文主要使用Python将两个CSV文件内数据合并在一起,合并方式有很多,本文只追加方式. 首先给定两个CSV文件的内容 1.CSV 2.CSV 将2.CSV文件里的数据追加到1.CSV后面 直接敲写Python代码 with open('1.csv','ab') as f: f.write(open('2.csv','rb').read())#将2.csv内容追加到1.csv的后面 查看1.CSV内的数据变化情况 非常简单快捷的一次Python操作

  • Python3实现将文件归档到zip文件及从zip文件中读取数据的方法

    本文实例讲述了Python3实现将文件归档到zip文件及从zip文件中读取数据的方法.分享给大家供大家参考.具体实现方法如下: ''''' Created on Dec 24, 2012 将文件归档到zip文件,并从zip文件中读取数据 @author: liury_lab ''' # 压缩成zip文件 from zipfile import * #@UnusedWildImport import os my_dir = 'd:/中华十大名帖/' myzip = ZipFile('d:/中华十大

  • asp.net上传Excel文件并读取数据的实现方法

    前言 本文主要给大家介绍了关于asp.net上传Excel文件并读取数据的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 实现如下: 前台代码:使用服务端控件实现上传 <form id="form1" runat="server"> <div> <asp:FileUpload ID="ExcelFileUpload" runat="server" /> <as

  • Android数据持久化之I/O操作详解

    本文实例讲述了Android数据持久化之I/O操作.分享给大家供大家参考,具体如下: 前面文章里我们简单的介绍了File的操作,这一节来说说使用android平台自带对象实现文件的基本操作 主要的两个类:openFileOutput(写)和openFileInput(读) 向文件中写如数据代码如下: //向文件写入内容 try { OutputStream os = openFileOutput("file-io.txt", Context.MODE_PRIVATE); String

  • 详解Android开发数据持久化之文件存储(附源码)

    其实我们在社交网络上面所发出的任何信息, 都希望能够保留下来. 那么如何实现呢? 数据持久化 数据持久化, 就是将内存中的瞬时数据保存在存储设备中, 保证即便关机之后, 数据仍然存在. 保存在内存中的数据是瞬时数据, 保存在存储设备中的数据就是处于持久状态的. 持久化技术则是提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换, Android系统中主要提供了3种方式用于简单地实现数据持久化功能, 即文件存储, SharePreference存储, 以及数据库存储. 当然你也可以将数据保存在

  • php读取二进制流(C语言结构体struct数据文件)的深入解析

    尽管php是用C语言开发的,不过令我不解的是php没有提供对结构体struct的直接支持.不过php提供了pack和unpack函数,用来进行二进制数据(binary data)和php内部数据的互转: 复制代码 代码如下: string pack ( string $format [, mixed $args [, mixed $...]] )   //Pack given arguments into binary string according to format.  array unp

  • Python实现读取txt文件中的数据并绘制出图形操作示例

    本文实例讲述了Python实现读取txt文件中的数据并绘制出图形操作.分享给大家供大家参考,具体如下: 下面的是某一文本文件中的数据. 6.1101,17.592 5.5277,9.1302 8.5186,13.662 7.0032,11.854 5.8598,6.8233 8.3829,11.886 7.4764,4.3483 8.5781,12 6.4862,6.5987 5.0546,3.8166 5.7107,3.2522 14.164,15.505 5.734,3.1551 8.408

  • MySQL数据库之数据表操作DDL数据定义语言

    目录 一.创建数据表 二.查询数据表 三. 删除数据表 四.修改数据表以及字段 一.创建数据表 数据表:一个二维的表格,一个表格是由多列组成,表格中的每一类称之为表格的字段 以上述学生信息表格为例在MySQL数据库中创建一张表格,语句如下(注:创建前应选择相应的数据库): create table students( stu_num char(8) not null unique, stu_name varchar(20) not null, stu_gender char(2) not nul

  • 详解使用Docker部署MySQL(数据持久化)

    本文简述如何使用Docker部署mysql,同时持久化数据.我们会用到tutum-docker-mysql 这个项目来搭建一个mysql,省去重头写Dockerfile的时间. 首先我们将tutum-docker-mysql跑起来. docker run -d -p 3306:3306 --name mysql tutum/mysql 如果你本地没有tutum/mysql的image,docker会先下载它的image,这一步可能会用些时间.待执行完毕我们检查一下应该会有如下样子 tutum-d

  • Kubernetes存储系统数据持久化管理详解

    目录 引言 安装存储系统 PV PVC StorageClass 安装NFS Provisioner 使用StorageClass 总结 引言 Kubernetes为了能更好的支持有状态应用的数据存储问题,除了基本的HostPath和EmptyDir提供的数据持久化方案之外,还提供了PV,PVC和StorageClass资源对象来对存储进行管理. PV的全称是Persistent Volume(持久化卷),是对底层数据存储的抽象,PV由管理员创建.维护以及配置,它和底层的数据存储实现方法有关,比

随机推荐