【C语言】文件操作<1>

目录

1.为什么使用文件

2.什么是文件

2.1 程序文件

2.2 数据文件

2.3 二者的关系

 2.4 文件名

3.文件的打开和关闭

3.1文件指针

3.2 文件的打开与关闭

 4.文件的顺序读写

只写模式

单个字符输出(fputc)

 整行的输出(fputs)

只读模式

拷贝文件


1.为什么使用文件

文件的功能是储存数据

既然内存也能储存信息,为什么要使用文件

存在即合理,文件的存在能让我们的信息持久化,也就是说,即使一个程序的结束,只要储存的信息已经保存,下次依然可以访问到这些信息

就比如说通讯录,每储存一个人,都需要放在文件里保存,不然信息就会丢失

2.什么是文件

储存在磁盘中的文件就是文件
在程序设计中,根据文件的功能,常说的文件包括程序文件和数据文件

2.1 程序文件

源程序文件(后缀为.c)

目标文件(在windows环境后缀为.obj)

可执行文件(后缀为.exe)

2.2 数据文件

文件的内容不仅仅只有程序

可能是程序要从中读取的数据、或者输出内容的文件

2.3 二者的关系

【C语言】文件操作<1>_第1张图片

当然文件的后缀并不能就说明这是说明类型的文件

 同样都是.c为后缀的文件,也可能是数据文件

功能决定文件类型

【C语言】文件操作<1>_第2张图片

 2.4 文件名

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

1.路径(用来找到文件)
2.主干名(识别是什么)
3.后缀(文件的格式或属性)

例如c:\code\test.txt

一般情况下,文件标识就是文件名

3.文件的打开和关闭

3.1文件指针

知道文件的功能后,具体怎样通过程序来访问文件的呢

打开文件,并对文件的内容进行修改,离不开文件指针

文件指针也称为文件类型指针

文件一旦创建,就会在内存里形成一个文件信息区,这个文件信息区以结构体的形式储存在内存中,这个结构体的用来存放文件的相关信息,例如文件的名字,文件状态以及当前的位置。

该结构体类型由系统声明的,取名为FILE。

不同编译器文件信息区的内容不相同,但是都是大同小异的         

3.2 文件的打开与关闭

访问文件,就需要打开文件和关闭文件

分别用到fopen和fclose库函数,其中fopen可以选择多种功能进行打开,也就是说,随着访问需求不同,就需要不同的打开模式(mode)。

模式的概要如下:

只读模式:只从文件输入

只写模式:只向文件输出

更新模式:对文件进行输入和输出

追加模式:从文件末尾处开始向文件输出

                          fopen
头文件               #include 
格式                    FILE *fopen(const char *filename,const char *mode)
                             r  以只读模式打开一个已存在的文本文件,如果文件不存在,会出错。
                            w  以只写模式生成文本文件,若文件存在则文件长度清为Q②.
                            a  以追加模式,也就是从文件末尾处开始的只写模式,打开或生成文本文件。
打开方式              rb 以只读模式打开二进制文件。
                            wb以只写模式生成二进制文件,若文件存在则文件长度清为0.
                            ab 以追加模式,也就是从文件末尾处开始的只写模式,打开或生成二进制文件。
                            r+ 以更新(读写)模式打开文本文件。
                            w+以更新模式生成文本文件,若文件存在则文件长度清为0.
                            a+以追加模式,也就是从文件末尾处开始写入的更新模式,打开或生成文本文件。
返回值                 返回一个指向对象的指针,该对象用于控制已打开的流。若打开操作失败,则返回空指针

 这里的“流”,是一个宏观概念,通过连接键盘,显示器等周边机器形成的 “字符流通的管道”

                            fclose
头文件               #include 
格式                    int fclose(FILE *stream);
功能                    刷新stream指向的流,关闭与该流相连的文件。流中只进行了缓冲操作,还未被写入的数据                             会被传递到主机环境,由主机环境把这些数据写入文件中,而缓冲区里面尚未被读取的数据                             会被丢弃。然后把该流与文件分离,如果存在系统自动分配的与该流相连接的缓冲区,则会                             释放该缓冲区。
返回值                 成功关闭流时返回0,检测出错误时则返回EOF
//以只读模式访问文件
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
	//打开文件
	FILE* fp = fopen("text.txt","r");
	//判断是否成功打开
	if (fp == NULL)
	{
		printf("%s\n", strerror(errno));//打印出错误原因
		return 0;
	}
	//关闭文件
	fclose(fp);
	fp = NULL;
	return 0;
}

【C语言】文件操作<1>_第3张图片

 当利用只读模式(r)访问文件时

如果文件不存在,就会返回错误,这里用strerror打印出错误原因

不存在text文件时

【C语言】文件操作<1>_第4张图片 

当利用只写模式(w)访问文件时

如果文件不存在,就会自动创造一个文件(text)

【C语言】文件操作<1>_第5张图片

 4.文件的顺序读写

只写模式

单个字符输出(fputc)

                          fputc
头文件              #include 
格式                  int fputc(int C, FILE *stream);
功能                  将c指定的字符转换成unsigned char 型并写入 stream 指向的输出流                                  
返回值               返回写入的字符,若发生写入错误,则对流设置错误指示符并返回 EOF
 //从内存中输出到文件流中
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
	//打开文件
	FILE* fp = fopen("text.txt","w");
	//判断是否成功打开
	if (fp == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//写文件,从内存中输出到文件中
    int i = 0;
	for (i = 'a'; i <= 'z'; i++)
	{
		fputc(i,fp);
	}
	//关闭文件
	fclose(fp);
	fp = NULL;
	return 0;
}

【C语言】文件操作<1>_第6张图片 程序运行后:

【C语言】文件操作<1>_第7张图片

 

当C语言程序运行起来,就会默认打开三种流:

标准输入流:stdin

标准输出流:stdout

标准错误流 :stderr

从键盘上输入内存时,就是将数据输入到标准输入流

从内存上输入显示器上时,就是将数据输入到标准输出流

【C语言】文件操作<1>_第8张图片 

【C语言】文件操作<1>_第9张图片

 而fgetc适用于所有的输入流

所以fgetc既可以通过文件输出流到磁盘中的文件上,也可以通过标准输出流打印到显示屏上

只需要将 fputc(i,fp)改成fputs(i,fp)。

【C语言】文件操作<1>_第10张图片

 整行的输出(fputs)

                          fputs
头文件              #include 
格式                  int fputs(const char *s, FILE *stream);
功能                  把参数s指向的字符串写入stream指向的流,但不包括字符串末尾的空字符                              
返回值               若发生写入错误则返回EOF,否则返回非负值
 #define _CRT_SECURE_NO_WARNINGS 1
 #include
 #include
 int main()
 {
	 //打开文件
	 FILE* fp = fopen("text.txt","w");
	 //判断是否成功打开
	 if (fp == NULL)
	 {
	 	printf("%s\n", strerror(errno));
	 	return 0;
	 }
	 fputs("abcdef",fp );
	 //关闭文件
	 fclose(fp);
	 fp = NULL;
	 return 0;
 }

只读模式

单个字符的输入 (fgetc)

                          fgetc
头文件              #include 
格式                  int fgetc(FILE *stream);
功能                  从stream指向的输入流中读取 unsigned char 型的下一个字符的值                         
返回值               返回EOF.发生读取错误时,则对该流设置错误指示符并返回 EOF
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
	//打开文件
	FILE* fp = fopen("text.txt", "r");
	//判断是否成功打开
	if (fp == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//读文件
	int ch;
	while ((ch=fgetc(fp))!=EOF)
	{
		printf("%c ", ch);
	}
	//关闭文件
	fclose(fp);
	fp = NULL;
	return 0;
}

整行的输入(fgets)

                          fgets
头文件              #include 
格式                  char *  fgets(char * s, int n,FILE *stream);
功能                  从stream指向的输入流中读取 unsigned char 型的字符串                       
返回值               函数获取字符串放入数组a,返回该数组的指针(首地址)如果读完,则返回空指针NULL
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
	//打开文件
	FILE* fp = fopen("text.txt", "r");
	//判断是否成功打开
	if (fp == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//读文件
	char ch[3];
	fgets(ch,3,fp);
		printf("%s", ch);
	//关闭文件
	fclose(fp);
	fp = NULL;
	return 0;
}

【C语言】文件操作<1>_第11张图片

这里的fgets的第二个参数就是决定读取多少个字符,读取的字符数就是对应的数字减一; 

拷贝文件

#include
#include
int main()//拷贝文件
{
	FILE* pr = fopen("text.txt", "r");
	if (pr == NULL)
	{
		printf("open for read:%s\n", strerror(errno));
		return 0;
	}
	FILE* pw = fopen("text2.txt","w");
	if (pr == NULL)
	{
		printf("open for write:%s\n", strerror(errno));
		close(pr);
		pr = NULL;
		return 0;
	}
	int ch=0;
	//拷贝文件
	while ((ch=fgetc(pr)) != EOF)
	{
		fputc(ch, pw);
	}
	//关闭文件
	fclose(pr);
	pr == NULL;
	fclose(pw);
	pw == NULL;
	return 0;
}

【C语言】文件操作<1>_第12张图片

此时拷贝的text2与text完全相同 

欢迎点赞收藏加关注,如若有问题可以提出来 

你可能感兴趣的:(C语言,c语言,后端)