C语言_10 文件操作

10 文件操作

10.1 概述
10.1.1 磁盘文件和设备文件

  • 磁盘文件
    指一组相关数据的有序集合,通常存储在外部介质(如磁盘)上。使用式才调入内存。
  • 设备文件
    在操作系统中把每一个与主机相连的输入、输出设备看作是一个文件,把它们的输入、输出等同于对磁盘文件的读和写。

10.1.2 磁盘文件的类型
计算机的存储在物理上二进制的,所以物理上所有的磁盘文件本质上都是一样的:以字节为单位进行顺序存储。
在这里插入图片描述
从用户或者操作系统使用的角度(逻辑上)把文件分为:

  • 文本文件:基于字符编码的文件
  • 二进制文件:基于值编码的文件

10.1.3 文本文件和二进制文件
(1)文本文件

  • 基于字符编码,常见编码有ASCII、UNCODE等
  • 一般可以使用文本编辑器直接打开
  • 数5678以ASCII存储形式(ASCII码)为: ‘5’(ASCII 53) 00110101
    00110101 00110110 00110111 00111000
    (2)二进制文件
  • 基于值编码,自己根据具体应用,指定某个值是什么意思
  • 把内存中的数据按其在内存中的存储形式原样输出到磁盘上
  • 数5678的存储形式(二进制码)为:00010110 00101110

10.2 文件的打开和关闭
10.2.1 文件指针
在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。

#include<stdio.h>
typedef struct
{
   
	short level;//缓冲区“满”或者“空”的程序
	unsigned flags;//文件状态标志
	char fd;//文件描述符
	unsigned char hold;//如无缓冲区不读取字符
	short bsize;//缓冲区大小
	unsigned char *buffer;//数据缓冲区的位置
	unsigned ar;//指针,当前的指向
	unsigned istemp;//临时文件,指示器
	short token;//用于有效性的检查
}FILE;
int main01()
{
   
	//FILE
	return 0;
}

FILE是系统使用typedef定义出来的有关文件信息的一种结构体类型,结构中有文件名、文件状态和文件当前位置等信息
声明FILE结构体类型的信息包含在头文件"stdio.h"中,一般设置一个指向FILE类型变量的指针变量,然后通过它来引用这些FILE类型变量。通过文件指针就可以对它所指的文件进行各种操作。
在这里插入图片描述
C语言中有三个特殊的文件指针由系统默认打开,用户无需定义即可直接使用

  • stdin:标准输入,默认当前终端(键盘),我们使用的scanf、getchar函数默认从此终端获得数据。
  • stdout:标准输出,默认为当前终端(屏幕),我们使用的printf、puts函数默认输出信息到此终端。
  • stderr:标准出错,默认为当前终端(屏幕),我们使用的perror函数默认输出信息到此终端。。

在这里插入图片描述
10.2.2 文件的打开
任何文件使用之前必须打开:

#include<stdio.h>
FILE *fopen(const char *filename,const char *mode);

功能:打开文件
参数:filename:需要打开的文件名,根据需要加上路径
mode:打开文件的模式设置
返回值:成功:文件指针 失败:NULL
第一个参数的几种形式:

#include<stdio.h>
int main02()
{
   
	//先在D:\下创建一个文件a.txt
	//FILE *fp=fopen("D:/a.txt","r");//路径斜杠 /或反斜杠\\
	FILE *fp_passwd=NULL;
	//相对路径 
	//打开当前目录passwd文件:源文件(源程序所在目录)
	FILE *fp_passwd=fopen("passwd.txt","r");
	//打开当前目录(text)下passwd.txt文件
	fp_passwd=fopen("./test/passwd.txt","r");
	//打开当前目录上一级目录(相对当前目录)passwd.txt文件
	fp_passwd=fopen("../passwd.txt","r");
	//绝对路径
	fp_passwd=fopen("c:/test/passwd.txt","r");
	
	/*
	文件打开失败原因:
	1.找不到文件 
	2.文件权限(读 写 执行)
	3.程序打开文件超出上限 65535 ungsined short类型最大值
	先判断文件打开是否成功,若失败操作的是空指针
	*/
	if(fp==NULL)
	{
   
		printf("文件打开失败\n");
		return -1;	
	}
	printf("文件打开成功:%p\n",fp);
	fclose(fp);//改变此文件指针,无法关闭
	return 0;
}

第二个参数的几种形式(打开文件的方式):
在这里插入图片描述
注意:

  • b是二进制模式的意思,b只是在Windows有效,在Linux用r和rb的结果是一样的
  • Unix和Linux下所有的文本文件行都是\n结尾,而Windows所有的文本文件行都是\r\n结尾
  • 在Windowa平下,以“文本”方式打开文件,不加b:
    当读取文件的时候,系统会将所有的"\r\n"转换成"\n"
    当写入文件的时候,系统会将"\n"转换成"\r\n"写入
    以“二进制”方式打开文件,则读写\n都不会进行这样的转换
  • 在Unix/Linux平台下,“文本”与“二进制”模式没有区别,"\r\n"作为两个字符原样输入输出

10.2.3 文件的关闭
任何文件在使用后应该关闭:

  • 打开的文件会占用内存资源,如果总是打开不关闭,会消耗很多内存
  • 一个进程同时打开的文件数是有限制的,超过最大同时打开文件数,再次调用fopen打开文件会失败
  • 如果没有明确的调用fclose关闭打开的文件,那么程序在退出的时候,操作系统会同一关闭
#include<stdio.h>
FILE fclose(FILE *stream);

功能:关闭先前fopen()打开的文件。此动作让缓冲区的数据写入文件中,并释放系统所提供的文件资源。
参数:stream:文件指针
返回值:成功:0 失败:-1

10.3 文件的顺序读法
10.3.1 按照字符读写文件fgetc、fputc
(1)写文件

#include<stdio.h>
int fputc(int ch,FILE *stream);

功能:将ch转换为unsigned后写入stream指定的文件中
参数:ch:需要写入文件的字符 stream:文件指针
返回值:成功:成功写入文件的字符 失败:-1
(2)文件结尾
在C语言中,EOF表示文件结束符(end of file)。在while循环中EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值得范围时0~127,不可能出现-1,因此可以用EOP作为文件结束标志。

#define EOF (-1)

当把数据以二进制形式存放到文件中时,就会有-1值得出现,因此不采用EOF作为二进制文件的结束标志。为解决这一问题,ANSI C提供一个feof函数,用来判断文件是否结束。feof函数可以判断二进制文件有可用以判断文本文件

#include<stdio.h>
int feof(FILE *stream);

功能:检测是否读取到了文件结尾。判断的是最后一次“读操作的内容”,不是当前位置内容(上一个内容)。
参数:stream:文件指针
返回值:非0值:已经到文件结尾 0:没有到文件结尾
(3)读文件

#include<stdio.h>
int fgetc(FILE *stream);

功能:从stream指定的文件中读取一个字符
参数:stream:文件指针
返回值:成功:返回读取到的字符 失败:-1

#include<stdio.h>
int main03()
{
   
	FILE *fp=fopen("D:/a.txt","r");
	if(!fp)
	{
   
		printf("文件打开失败\n");
		return -1;	
	}
	char ch;
	//文件的字符读取 文件默认结尾为-1
	ch=fgetc(fp);
	printf("%c\n",ch);
	//fp++ 不能修改文件指针 文件在读取时光标流自动向下移动
	//关闭文件
	fclose(fp);
	return 0; 
}
int main04()
{
   
	FILE *fp=fopen("D:/a.txt","r");
	if(!fp)
	{
   
		printf("文件打开失败\n");
		return -1;	
	}
	char ch;
	while(ch=fgetc(fp))!=EOF{
   
		printf("%c\n",ch);
	}
	fclose(fp);
	return 0; 
}
int main05()
{
   
	//以写的方式打开文件,如果文件不存在会创建一个新文件 如果文件存在 会清空内容
	FILE *fp=fopen("D:/a.txt","w");
	if(!fp)
	{
   
		printf("文件打开失败\n");
		return -1;	
	}
	char ch='a';
	//字符写入
	fputc(ch,fp);
	fclose(fp);
	return 0; 
}
int main06()
{
   
	FILE *fp=fopen("D:/a.c","w");
	if(!fp)
	{
   
		printf("文件打开失败\n");
		return -1;	
	}
	char ch;
	while(1)
	{
   
		scanf(%c,&ch);
		if(ch=='@')
		{
   
			break;
		}
		fputc(ch,fp);
	}
	fclose(fp);
	return 0; 
}

简单的加密解密:

#include<stdio.h>
//加密
int main07()
{
   
	FILE *fp1=fopen("D:/解密.txt","r");
	FILE *fp2=fopen("D:/加密.txt","w");
	if(!fp1||!fp2)
	{
   
		printf("文件打开失败\n");
		return -1;
	}
	char ch;
	while((ch=fgetc(fp1))!=EOF)
	{
   
		ch++;
		fputc(ch,fp2);
	}
	fclose(fp1);
	fclose(fp2);
	renturn 0;
}
```c
#include<stdio.h>
//解密
int main08()
{
   
	FILE *fp1=fopen("D:/加密.txt","r");
	FILE *fp2=fopen("D:/解密文件.txt","w");
	if(!fp1||!fp2)
	{
   
		printf("文件打开失败\n");
		return -1;
	}
	char ch;
	while((ch=fgetc(fp1))!=EOF)
	{
   
		ch--;//加随机数无法解密
		fputc(ch,fp2);
	}
	fclose(fp1);
	fclose(fp2);
	renturn 0;
}

10.3.2 按照行读写文件fgets、fputs
(1)写文件

#include<stdio.h>
int fputs(const char *str,FILE *stream);

功能:将str所指定的字符串写入stream指定的文件中,字符串结束符’\0’不写入文件。
参数:str:字符串 stream:文件指针
返回值:成功:0 失败:-1
(2)读文件

#include<stdio.h>
int fgets(char *str,int size,FILE *stream);

功能:从stream指定的文件内读取字符,保存到str所指定的内存空间,直到出现换行符、读到文件结尾或是已读了size-1个字符为止,最后会自动加上字符’\0’作为字符串结束。
参数:str:字符串 size:指定最大读取字符串的长度(size-1) stream:文件指针
返回值:成功:成功读取的字符串 读到文件尾或出错:NULL

#include<stdio.h>
int main09()
{
   
	FILE *fp=fopen("D:/a.txt","r");
	if(!fp)
	{
   
		printf("文件打开失败\n");
		return -1;	
	}
	char *p=(char *)malloc(sizeof(char)*100);
	memset(p,0,sizeof(char)*100);
	fgets(p,100,fp);
	printf("%s\n",p);
	free(p);
	fclose(fp);
	return 0;
}
int main10()
{
   
	FILE *fp=fopen("D:/a.txt","r");
	if(!fp)
	{
   
		printf("文件打开失败\n");
		return -1;	
	}
	char *p=(char *)malloc(sizeof(char)*100);
	while(!feof(fp))//feof 返回0 没有到文件结尾
	{
   
		memset(p,0,sizeof(char)*100);
		fgets(p,100,fp);
		printf("%s\n",p);
	}
	free(p);
	fclose(fp);
	return 0;
}
int main11()
{
   
	FILE *fp=fopen("D:/b.txt","r");
	if(!fp)
	{
   
		printf("文件打开失败\n");
		return -1;	
	}
	char ch[]="我喜欢学英语";//遇到\0停止
	fputs(ch,fp);
	fclose(fp);
	return 0;
}
#include<stdio.h>
#include<string.h>
int main12()
{
   
	FILE *fp=fopen("D:/b.txt","w");
	if(!fp)
	{
   
		printf("文件打开失败\n");
		return -1;	
	}
	char *p=(char *)malloc(sizeof(char)*1024);
	while(1)
	{
   
		memset(p,0,sizeof(char)*1024);
		//scanf("%s",p);//无法显示换行符
		//fgets()接收用户输入字符
		scanf("%[^\n]",p);//接收非换行符
		getchar();//吞噬回车\n
		//停止输入命令 comm=exit
		if(!strcmp(p,"comm=exit"))
			break;
		//字符串追加\n
		strcat(p,"\n");
		fputs(p,fp);
	}
	free(p);
	fclose(fp);
	return 0;
}

四则运算:10+2=
值 运算符 值=\n sprintf
sprintf 直接打印到字符串中
printf 直接在命令行上输出

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
enum opt
{
   
	add,sub,mlt,dive
};//op;
int main13() 
{
   
	srand((size_t)time(NULL));
	FILE *fp=fopen("D:/四则运算.txt","w");
	if(!fp)
	{
   
		printf("文件打开失败\n");
		return -1;	
	}
	int a,b;
	char c;//+ - * /
	char *p=(char*)malloc(sizeof(char)*20);
	for(int i=0;i<100;i++)
	{
   
		a=
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值