C语言 文件读写

文件的分类:

​ 文本文件: 储存的是ASCII码值的二进制

​ 二进制文件:储存的是数据的补码

文件IO:

​ FILE *fopen(const char *path, const char *mode);

​ 功能:打开或者创建文件

​ path:文件的路径

​ mode:打开模式

​ r 以只读权限打开文件,如果该文件不存在,则打开失败,返回空指针

FILE* frp = fopen("./test.txt","r"); 
if(NULL == frp)
{
	prrror("fopen");//	只有系统函数可以使用
}

​ r+ 在 r 的基础上,增加写权限,如果不存在,依然不能打开

​ w 以只写权限打开文件,如果文件不存在则创建,如果文件存在则会清空

​ w+ 在 w 的基础上,增加读权限

​ a 以追加的形式打开文件,如果文件不存在则新建,如果文件存在则不清空,新写入的数据会在文件的末尾

​ a+ 在 a 的基础上,增加读权限

​ 注意:以上方式打开文件都是以文本文件形式来操作文件的,在它们的基础加上b

​ 返回值:结构指针,不需要关心它的成员,只需要知道它是操作该文件的唯一凭证

​ 二进制形式的读写:

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从内存中把数据写入到文件中
ptr: 要写入的内存的首地址
size: 一次写入的字节数
nmemb: 写入多少次
FILE*: 文件指针,fopen的返回值
返回值:成功写入的次数

 {
	FILE* fwp = fopen("./test.txt","w");
	if(NULL == fwp)
	{
		perror("fopen");
		return 1;
	}
	char str[] = "haa";
	fwrite(str,1,strlen(str),fwp);
}   
    
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从文件中读取数据到内存中
ptr:要读取到内存的首地址
size:每次读取多少个字节
nmemb:读取多少次
FILE*:文件指针
返回值:成功读取到的次数

{    
	FILE* frp = fopen("./test.txt","r");
	if(NULL == frp)
	{
		perror("fopen");
		return 1;
	}
	char buf[255] = {};
	fread(buf,1,255,frp);
	printf("%s\n",buf);
}

文本形式的读写:

int fprintf(FILE *stream, const char *format, …);

功能:以文本形式写入数据到文件中

stream:要写入的文件指针

format:占位符…

…:变量列表

返回值:成功写入的字符个数

int fscanf(FILE *stream, const char *format, …);

功能:以文本形式从文件中读取数据到内存中

stream:要写入的文件指针

format:占位符…

…:变量列表的地址

返回值:成功读取到的变量的个数

    int fclose(FILE *fp);    
    功能:关闭文件(因为有缓冲区的存在,想要立即写入到文件,关闭一下文件)
    文件位置指针:        
    每个打开的文件都会有一个文件位置指针指向要读写的位置,它会随着文件的读写而移动,以r、r+、w、w+模式打开文件,文件位置指针会在文件的开头,以a\a+打开,文件位置指针会在文件的末尾        
    int fseek(FILE *stream, long offset, int whence);        
    功能:设置文件的位置指针        
    stream:要设置的文件指针        
    offset:偏移值        
    whence:基础位置            
    SEEK_SET:文件的开头            
    SEEK_CUR: 文件指针的当前位置            
    SEEK_END: 文件的末尾        返回值:成功返回0,失败返回-1
        void rewind(FILE *stream);       
        功能:把文件位置指针设置到文件开头
        long ftell(FILE *stream);        
        功能:获取文件位置指针当前所在的位置        返回:所在第几个字节
        int feof(FILE *stream);        
        功能:检查文件位置指针是否已经到达末尾        返回值:如果到达末尾返回非零值
        char *fgets(char *s, int size, FILE *stream);        
        功能:从文件中读取一行字符串
        int fputs(const char *s, FILE *stream);        
        功能:写入一个字符串到文件中,会自动添加\n在末尾
        int fgetc(FILE *stream);        
        功能:从文件中读取一个字符
        int fputc(int c, FILE *stream);        
        功能:写入一个字符到文件中
        int remove(const char *pathname);        
        功能:删除一个文件        返回值:成功返回0,失败返回-1
        int rename(const char *oldpath, const char *newpath);        
        功能:重命名文件        返回值:成功返回0,失败返回-1
main函数的参数:        
是为了获取命令行的参数           
argc    代表了命令行参数的总个数        
argv    代表了每个参数字符串的首地址

练习:定义一个教师的结构体变量并初始化,把该变量以二进制形式写入到文件中

#include <stdio.h>
#include "i.h"

int main(int argc,const char* argv[])
{
	Teacher tch = {"张老师",'w',10,12345};

	FILE* fwp = fopen("./tch.bin","w");
	if(NULL == fwp)
	{
		perror("fopen");
		return 1;
	}
	fwrite(&tch,sizeof(Teacher),1,fwp);
	return 0;
}

练习:从文件中读取教师结构体变量到内存中显示。

#include <stdio.h>
#include "i.h"

int main(int argc,const char* argv[])
{
	Teacher tch = {};

	FILE* frp = fopen("./tch.bin","r");
	if(NULL == frp)
	{
		perror("fopen");
		return 1;
	}
	fread(&tch,sizeof(Teacher),1,frp);
	printf("%s %c %hhd %d\n",tch.name,tch.sex,tch.wage,tch.id);
}

练习:定义一个教师的结构体变量并初始化,把该变量以文本形式写入到文件中

#include <stdio.h>
#include "i.h"

int main(int argc,const char* argv[])
{
	Teacher tch = {"张老师",'w',10,12334};

	FILE* fwp = fopen("./test1.txt","w");
	if(NULL == fwp)
	{
		perror("fopen");
		return 1;
	}
	fprintf(fwp,"%s %c %hhd %d",tch.name,tch.sex,tch.wage,tch.id);
}

练习:从文件中以文本文件读取教师结构体变量到内存中显示。

#include <stdio.h>
#include "i.h"

int main(int argc,const char* argv[])
{
	Teacher tch = {};

	FILE* frp = fopen("./test1.txt","r");
	if(NULL == frp)
	{
		perror("fopen");
		return 1;
	}
	fscanf(frp,"%s %c %hhd %d",tch.name,&tch.sex,&tch.wage,&tch.id);
	printf("%s %c %hhd %d",tch.name,tch.sex,tch.wage,tch.id);
}

练习5:实现cp命令的功能

#include <stdio.h>

int main(int argc,const char* argv[])
{
	if(argc != 3)
	{
		printf("User :cp dest str\n");
		return 0;
	}
	for(int i = 0; i<argc; i++)
	{
		printf("%s\n",argv[i]);
	}
	//	打开文件
	FILE* frp = fopen(argv[1],"r");
	if(NULL == frp)
	{
		perror("fopen");
		return 0;
	}
	//	新建文件
	FILE* fp = fopen(argv[2],"r");
	if(fp)
	{
		perror("文件已存在,是否覆盖(y/n) ?");
		char cmd = getchar();
		if('y' != cmd && 'Y' != cmd)
		{
			printf("停止拷贝\n");
			return 0;
		}
		fp = fopen(argv[2],"w");
	}
	else
	{
		fp = fopen(argv[2],"w");
	}
	
	if(NULL == fp)
	{
		printf("创建目标文件失败,请检查路径\n");
		return 0;
	}
	//	边写边读,直到文件位置指针读到末尾
	char buf[256] = {};
	int ret = 0;
	while(0 < (ret = fread(buf,1,sizeof(buf),frp)))
	{
		fwrite(buf,1,ret,fp);
	}
	//	关闭文件
	fclose(frp);
	fclose(fp);
	frp = NULL;
	fp = NULL;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值