文件的操作

文件

1.文件的分类

程序文件

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

后缀为.exe)。

数据文件

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

本章讨论的是数据文件。在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显

示器上。其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理

的就是磁盘上文件。

2文件的打开与关闭

每个被打开的文件都在内存中开辟一个相应的文件信息去,用来存放文件信息。这些信息保存在一个结构体变量中。结构体取名为FILE。创建一个FILE* pf 的指针变量,通过pf可以文件里面的内容进行操作。

使用文件指针的通用步骤:

  FILE * pFile;
  //打开文件
  pFile = fopen ("myfile.txt","w");
  //文件操作
  if (pFile!=NULL)
 {
    fputs ("fopen example",pFile);
    //关闭文件
    fclose (pFile);
 }
 

3文件的顺序读写

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8WO0rlhr-1689739546285)(C:\Users\22724\AppData\Roaming\Typora\typora-user-images\image-20230717120431137.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VmHmDkEC-1689739546285)(C:\Users\22724\AppData\Roaming\Typora\typora-user-images\image-20230717120636895.png)]

fgetc 与fputc的操作

int main(void)
{
	//以写的方式创建文件
	FILE* pf = fopen("da.txt", "w");
 
 //判断文件
 if(pf== NULL)
 {
		perror("fopen");
		return;
 
 }
	//写文件
	
	//fputc('a',pf);//字符是以ascll码存储的
	//fputc('a', stdout);//stdout将'a'输出到屏幕上

	//读文件fgetc
	int ch = fgetc(pf); //适用于标准输入流, 文件输入流, 操作对象是字符,当文件读完或读取失败时,会返回EOF


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

fgets与fputs的操作

*int main(void)
{
	FILE* pf = fopen("da.txt", "r");*///写的时候为w,读的时候位r
	//fputs  文本行输出函数
	fputs("abcdf", pf);
//判断文件
 if(pf== NULL)
 {
		perror("fopen");
		return;
 
 }
	fgets 文本行输入函数
	char arr[10];
	int c = fgets(arr,2,pf );//实际上只读取了一位,因为最后一位要加上'\0'我强强强强1
	printf("%s", arr);
	关闭文件
	fclose(pf);
	pf = NULL;

}

fprintf,fscanf,格式化的输出流与输入流

struct S
{
	int i;
	char a;
};
int main(void)
{

	FILE* pf = fopen("da.txt", "r");
	//判断文件
		 if(pf== NULL)
		 {
				perror("fopen");
				return;
		 }
		 struct S s;
		/* s.i = 10;
		 s.a = 'c';*/
		 fprintf(pf, "%d %c", s.i, s.a);//从后面往前面输出到pf里面



		// 下面以读的形式
		 struct S s = { 0 };
		 fscanf(pf, "%d %c", &(s.i), &(s.a));//从前面往后面输出
		 printf("%d %c", s.i, s.a);

	fclose(pf);
	pf = NULL;


}

sprintf ,sscanf用于非文件的操作

struct S
{
	int a;
	char i;

};
int main()
{

	struct S s = {0};
	char arr[30] ;
	scanf("%s", arr);
	sprintf(arr,"%d %c\n",s.a,s.i);//注意空格在%d 与%c,也会输入到arr中
	printf("%s ", arr);
	sscanf(arr, "%c", &(s.i));
	
	return 0;

fseek的使用

int main(void)
{
	FILE* pf = fopen("da.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return;
	}
	fseek(pf, 5, SEEK_SET);//从下标为5的位置开始读

}

feof用于检测文件读取结束的原因,ferror判定文件是否读取失败

int main(void)
{
	FILE* pf = fopen("da.txt", "r");
	if (!pf)
	{
		perror("fopen");
		return;
	}
	int c ;
	while ((c = fgetc(pf)) != EOF)
	{
		putchar(c);
	}
	//putchar(1);
	if (ferror(pf))
	{
		perror("ferror");
	}
	else if(feof(pf))
	{
		puts("文件读取结束");
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值