C语言:文件操作

本文详细介绍了C语言中文件的分类(程序文件和数据文件)、如何通过流和标准流进行数据操作,包括文件的打开、关闭、以及fopen、fclose和fgetc等函数的使用。
摘要由CSDN通过智能技术生成

1.什么是文件

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

1.1  程序文件

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

1.2数据文件

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

2.文件的打开和关闭

2.1流和标准流
2.1.1流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。
C程序针对文件、画面、键盘等的数据输入输出操作都是通过流操作的。
⼀般情况下,我们要想向流里写数据,或者从流中读取数据,都是要打开流,然后操作。

2.1.2标准流

那为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?


那是因为C语言程序在启动的时候,默认打开了3个流:
• stdin - 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。
• stdout - 标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出
流中。
• stderr - 标准错误流,大多数环境中输出到显示器界面。
这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。
stdin、stdout、stderr 三个流的类型是: FILE * ,通常称为文件指针。
C语言中,就是通过 FILE* 的文件指针来维护流的各种操作的。

2.2文件指针

 

FILE* pf;

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

例如:

3.文件的打开和关闭 

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

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

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

//打开文件
FILE* fopen(const char* filename, const char* mode);

//关闭文件
int  fclose(FILE * stream);
3.1  //fopen函数

 

3.2   //fclose函数

 

 

 

 代码1://以"r"模式打开

int main()
{
	//打开文件,以读的形式打开
	FILE* pf = fopen("test.txt", "r");
	//根据fopen函数返回值可知如果以"r"模式打开文件后文件的值为
	//空,说明该文件不存在,我们可以使用perror在屏幕上打印错误信
	// 息,并且提前返回
	if (pf == NULL)
	{
		perror(pf);
		return 1;
	}
	//读文件

	//关闭文件
	fclose(pf);
	pf = NULL;
	//文件关闭后应及时置为空
	return 0;
}

代码2://以"w"模式打开

int main()
{
	//打开文件,以写的形式打开
	FILE* pf = fopen("test.txt", "w");
	//如果以"w"模式打开文件后该文件不存在,我们会主动新建1个名为
	// "test.txt"的文件
	if (pf == NULL)
	{
		perror(pf);
		return 1;
	}
	//写文件

	//关闭文件
	fclose(pf);
	pf = NULL;
	//文件关闭后应及时置为空
	return 0;
}

4.文件的顺序读写

 

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

一个字符一个字符的读取

 

 

 

 

提醒:如果fgetc读取字符成功,返回的是该字符的ASCII码值 

如果读取文件结尾或者读取失败的时候,返回EOF(-1)。

 

代码1://fgetc的使用

test.txt文件

acbdhjm
int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//写文件
	int ch = fgetc(pf);
	printf("%c\n", ch);

	ch = fgetc(pf);
	printf("%c\n", ch);

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

	return 0;
}

结果:

 讲解:一开始的时候鼠标指向第一个字符前面的位置,调用fgetc的时候就会读取到第一个字符a,此时鼠标就会移动到a的后面,c的前面,再次调用fgetc就会向后读取字符c,使用printf将c打印在屏幕上。

 

 

 假设我们将test.txt文件中的内容改为acb

结果如下:

 

此时鼠标指向第一个字符a的前面,向后读取一个字符a,在屏幕上打印字符a 

 

 此时鼠标指向第一个字符a的后面,向后读取一个字符c,在屏幕上打印字符c

 

 此时鼠标指向第二个字符c的后面,向后读取一个字符b,在屏幕上打印字符b

 

 此时鼠标指向第三个字符b的后面,此时鼠标已指向文件末尾,所以会返回EOF(-1)。

 

 

代码2:

//test.txt文件

abcdefghijklmnopqrstuvwxyz

 //将26个英语字母打印在屏幕上

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

	//读文件
	//将26个英语字母打印
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c ", ch);
	}

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

	return 0;
}

 运行结果:

  • 32
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值