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

 更新时间:2021年10月17日 16:00  点击:1798

什么是文件

磁盘上的文件是文件

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

程序文件

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

数据文件 (本文重点)

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

文件名

文件就像人一样,他也要有姓氏和名字来让其他文件或者人知道这个文件是谁。

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

文件名格式:文件路径+文件名主干+文件后缀

例如:D:\CSDN\Test.txt

为了方便起见,我们叫文件标识为文件名

文件的打开和关闭

文件指针

我们知道,指针是指向一个地址的,整形指针指向一个整形的空间,数组指针指向一个数组的空间,那么文件指针自然就是指向文件的指针了。

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

这是再vs的stdio头文件下的文件信息区结构体

struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;
//不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。

就像学生要有学号姓名年龄这些信息一样,文件也有他的信息,比如这个文件的地址。这些信息存放于这个结构体中,通过typedef重命名为FILE,并且我们不需要关心一些细节(你会关心我昨天晚上吃了什么吗)。

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

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

FILE* pf;

pf通过该文件信息区中的信息就能够访问该文件。

也就是说,通过文件指针变量能够找到与它关联的文件。

但上面的文件指针并未指向明确的位置,他暂时是一个野指针

所以接下来,我们来学习如何打开(创建)一个文件。

文件函数

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

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

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

//打开文件
FILE* fopen(const char *filename,const char *mode);
//第一个参数是文件名,第二个参数是打开方式
//关闭文件
int Fclose(FILE *stream);

部分打开方式如下图

在这里插入图片描述

现在我们来练习一下打开文件

//打开文件
	FILE* pf = fopen("data.txt","r");
	//以只读的方式打开这个文件
	//如果文件打开失败会返回空,否则会返回指向该文件的指针
	if (pf == NULL){
		perror("fopen");
		return -1;
	}
	//读文件
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;

在这里插入图片描述

但是却打开失败了!!

原因是,从上面的打开方式一图我们可以看出,以"r"方式打开,需要该文件真实存在,但是我并没有创建这个文件,所以打开失败了

叮~文件创建成功

我们再来看执行结果

在这里插入图片描述

这回没有报错

但是,这里是将data.txt文件放在了该.c文件目录下,在我将该文件放在别的地方,仍然打开失败报错。

原因是,我们这段代码只输入了文件名,所以他只在当前文件目录下寻找该文件,在其他地方的文件我们就找不到了。

这里我们来看看两个东西,一个叫相对路径,一个叫绝对路径

相对路径与绝对路径

 相对路径

只认为是当前目录下的文件,如上面的代码中。

绝对路径

带上文件的从磁盘到目标文件的路径

例如

D:\Program Files\data.txt

但是请注意,在编程中,\是转义字符,所以我们需要让\不再是转义字符,使其代表它本身

D:\Program Files\data.txt

输入输出流

什么是输入输出流

学习过编程,一定知道printf或者cout或者System.out.println吧,

这些函数用于打印数据,这就是标准的输出流。使数据输出或者写入文件中,我们叫输出流。

我们打印HELLO WORLD在屏幕上,就是一个标准输出流

像scanf之类的,从文件输入或者读数据到内存中,就是输入流。

一些基本的输入输出函数如下。

在这里插入图片描述

比如,fputc就是写一个字符进去,fgetc就是读一个字符。

//打开文件
	FILE* pf = fopen("data.txt","w");
	if (pf == NULL){
		perror("fopen");
		return -1;
	}
	//读文件
	fputc('a', pf);
	fputc('b', pf);
	fputc('c', pf);
	//fputc第一个参数为输入的字符,第二个使对应文件的指针

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

在这里插入图片描述

写入了abc三个字符。

fputc和fgetc每次读/写一个字符后,文件指针pf会向后移动,类似strtok函数。会记录上一次输入/输出的地址。

如果不这样,那岂不是一直在一个位置重复写入或者读文件了。

接下来看看fgetc读取字符

//打开文件
	FILE* pf = fopen("data.txt","r");
	if (pf == NULL){
		perror("fopen");
		return -1;
	}
	//读文件

	int a = fgetc(pf);
	printf("%c", a);
	a = fgetc(pf);
	printf("%c", a);
	a = fgetc(pf);
	printf("%c",a);
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;

执行结果

在这里插入图片描述

这就是顺序读写,按着顺序读入写入。

当然,有顺序读写,就会有随机读写

从字面意思就能看到,随机读写emmm。

当然,除了fgetc这类,fgets自然就是读取一行了(只会读/写一行哦)

如果你用这类函数输出在标准输入或者标准输入(stdout或者stdin)上,他和printf,scanf没什么区别。

接下来,我们来看二进制的读和写

二进制读写

fwirte

在这里插入图片描述

以二进制的形式将内容写入文件中

第一个参数是你要写入数据的数据地址,第二个参数是一个类型的大小(字节)。第三个参数是你要写入几个数据,第四个则是你选定写入的流。

struct S{
	int n;
	double d;
	char name[10];
};

int main()
{
	struct S s = { 10, 3.14, "zhangsan" };
	//打开文件
	FILE* pf = fopen("data.txt","wb");
	if (pf == NULL){
		perror("fopen");
		return -1;
	}
	//读文件
	fwrite(&s,sizeof(s),1,pf);

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

如上代码会将数据以二进制的形式写入data.txt

虽然我们看不懂,但是能看到zhangsan是我们输入的内容

在这里插入图片描述

fread

以二进制的形式读

在这里插入图片描述

和fwirte一样,只不过buffer不是const形式了,因为我们要将数据读入该指针指向的目标。

struct S{
	int n;
	double d;
	char name[10];
};

int main()
{
	struct S s = {0};
	//打开文件
	FILE* pf = fopen("data.txt","rb");
	if (pf == NULL){
		perror("fopen");
		return -1;
	}
	//读文件
	fread(&s,sizeof(struct S),1,pf);
	printf("%d  %lf  %s\n",s.n,s.d,s.name);

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

在这里插入图片描述

总结

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

[!--infotagslink--]

相关文章

  • C语言实现放烟花的程序

    这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
  • php读取zip文件(删除文件,提取文件,增加文件)实例

    下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
  • C语言中的字符(char)详细讲解

    本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
  • php svn操作类

    以前我们开发大型项目时都会用到svn来同步,因为开发产品的人过多,所以我们会利用软件来管理,今天发有一居然可以利用php来管理svn哦,好了看看吧。 代码如下 ...2016-11-25
  • Jupyter Notebook读取csv文件出现的问题及解决

    这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06
  • 详解如何将c语言文件打包成exe可执行程序

    这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
  • Photoshop打开PSD文件空白怎么解决

    有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • C#实现HTTP下载文件的方法

    这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • SpringBoot实现excel文件生成和下载

    这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
  • php无刷新利用iframe实现页面无刷新上传文件(1/2)

    利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25
  • C#操作config文件的具体方法

    这篇文章介绍了在C#中对config文件的操作,有需要的朋友可以参考一下...2020-06-25
  • php批量替换内容或指定目录下所有文件内容

    要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
  • PHP文件上传一些小收获

    又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
  • python自动化办公操作PPT的实现

    这篇文章主要介绍了python自动化办公操作PPT的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-05
  • AI源文件转photoshop图像变模糊问题解决教程

    今天小编在这里就来给photoshop的这一款软件的使用者们来说下AI源文件转photoshop图像变模糊问题的解决教程,各位想知道具体解决方法的使用者们,那么下面就快来跟着小编...2016-09-14
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • Zend studio文件注释模板设置方法

    步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04
  • php文件上传你必须知道的几点

    本篇文章主要说明的是与php文件上传的相关配置的知识点。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,下面一一说明。打开php.ini配置文件找到File Upl...2015-10-21