温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C语言中怎么实现文件操作

发布时间:2021-10-18 09:17:35 来源:亿速云 阅读:105 作者:柒染 栏目:开发技术

本篇文章给大家分享的是有关C语言中怎么实现文件操作,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

    什么是文件

    磁盘上的文件是文件

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

    程序文件

    包括源程序文件(例如.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);

    部分打开方式如下图

    C语言中怎么实现文件操作

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

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

    C语言中怎么实现文件操作

    但是却打开失败了!!

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

    叮~文件创建成功

    我们再来看执行结果

    C语言中怎么实现文件操作

    这回没有报错

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

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

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

    相对路径与绝对路径

     相对路径

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

    绝对路径

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

    例如

    D:\Program Files\data.txt

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

    D:\Program Files\data.txt

    输入输出流

    什么是输入输出流

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

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

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

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

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

    C语言中怎么实现文件操作

    比如,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;

    C语言中怎么实现文件操作

    写入了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;

    执行结果

    C语言中怎么实现文件操作

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

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

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

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

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

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

    二进制读写

    fwirte

    C语言中怎么实现文件操作

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

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

    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是我们输入的内容

    C语言中怎么实现文件操作

    fread

    以二进制的形式读

    C语言中怎么实现文件操作

    和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语言中怎么实现文件操作,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI