c语言学习:文件操作

文件类型

从编程角度我们把文件分为两大类,为文本文件和二进制文件
二进制文件:存储的是数据的补码,无法用文本文件直接打开,好处是读取文件后就可以直接使用
文本文件:把数据以字符形式存储到文件中,可以被直接打开,检查数据是否正确,但读写都需要进行数据转换

操作函数

打开/关闭

打开文件:
FILE *fopen(const char *path, const char *mode)
功能:打开、创建文件
path: 文件的路径
mode: 打开方式
	"r"  以只读方式打开,不存在则失败
	"r+"  在r的基础上增加写权限
	"w"  以只写方式打开文件, 不存在则创建, 存在则清空文件内容
	"w+" 在w基础上增加读权限
	"a"  以只写方式打开文件, 不存在则创建 存在则追加内容到文件末尾
	"a+"  在a的基础上增加读权限
返回值:
	FILE结构指针,该结构中记录着被打开文件的相关数据,它是接下来操作文件的凭证 
	打开失败返回NULL
注意:如果文件本身没有相关权限 打开失败
	ls -l filename 查看文件权限
	r读 w写 x执行
int fclose (FILE* stream)
关闭文件

文本文件的读写

int fprintf(FILE *stream, const char *format, ...)
功能:以文本格式写入数据到文件
stream:要写入的文件,fopen的返回值
format: 格式
... : 要写的变量
返回值:成功写入字节数
FILE* file1=fopen("stu.txt","w");//打开文件
	if (NULL == file1)			//判断是否成功打开
	{
		printf("stu文件打开失败!");
		return ;
	}	
	for(int i=0;i<count_stu;i++)
	{
		fprintf(file1,"姓名:%s 性别:%s 学号:%d 语文:%f 数学:%f 英语:%f 密码:%s lock:%c\n",		//文件写入字符加格式
		((s+i)->name),((s+i)->sex),((s+i)->id),((s+i)->Chinese),((s+i)->Math),((s+i)->English),((s+i)->key),((s+i)->lock));		//对应地址的数据(与格式一一对应)
	}
	fclose(file1);

结果:
写入结果

int fscanf(FILE *stream, const char *format,...)
stream: 要读取的文件,fopen的返回值
format:占位符
... 存储数据变量的地址
返回值:成功读取的变量个数
例
	FILE* fp1= fopen("stu.txt", "r");//在校学生
	if (NULL == fp1)//判断文件是否成功打开
	{
		printf("stu文件打开失败!");
		return ;
	}	
	while (0<fscanf(fp1, "姓名:%s 性别:%s 学号:%d 语文:%f 数学:%f 英语:%f 密码:%s lock:%c\n", 		//文件读取格式
	s[count_stu].name,(s[count_stu].sex),&(s[count_stu].id),&(s[count_stu].Chinese), &(s[count_stu].Math), &(s[count_stu].English),(s[count_stu].key),&(s[count_stu].lock)))	//文件读取后存储位置(结构体s)
	count_stu++;
	fclose(fp1);

结果:
通过printf打印存储变量可知成功读取

char *fgets(char *s,int size, FILE *name)
功能 从文件中读取一行字符串,且可以限制字符串长度
fgets(str,size,stdin); 		//从终端中读取输入size-1个字符到char类型数组str中,末尾为'\n'

随机读写:
,每个打开文件都有一个指针记录着该文件读写到哪里,被称为文件的位置指针,会随读写移动
“r” “r+” 方式打开的文件,指针指向开头
“a” “a+” 方式打开的文件,指针指向末尾

int fseek (FILE *stream, long offset, int whence)
stream 要设置的位置
offset 偏移值
whence 基础位置
	SEEK_SET 开头
	SEEK_CUR 当前
	SEEK_END 末尾
返回值 成功为0 失败为-1
fseek(file,0,SEEK_SET)

void rewind(FILE *stream)
功能:把文件位置指针跳到开头

long  ftell(FILE *stream)
功能:获取文件指针所指向的字节数

二进制文件的读写

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE* stream)
功能:把内存的数据拷贝到文件中
ptr:要写入数据的内存首地址
size: 数据的每个元素字节数  不知道类型时写1
nmemb:元素的个数
stream:文件指针
返回值:成功写入的元素个数, 正常情况下应该是nmemb参数

size_t fread(void *ptr, size_t size, size_t nmemb, FILE* stream)
ptr:存储数据的内存首地址
size:数据的每个元素字节数
nmemb:要读取的元素的个数
stream:文件指针
int remove(const char pathname)
功能 删除文件

int rename(const char *oldpath, const char *newpath)
功能 重命名文件

int access(const char *pathname, int mode)
功能:测试文件权限
mode: 要测试的权限
	F_OK 文件是否存在
	W_OK 文件是否有写权限
	R_OK 文件是否有读权限
	X_OK 文件是否有执行权限
返回值 如果测试权限存在,返回0,否则-1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值