Sixth 运用文件的函数

前情回顾

一开始定义结构体指针或者其他指针时,不一定只是定义,可以先置空再赋值或开辟空间,可以避免用strcpy函数时的某些不必要错误;而释放之前也可以先判断要释放的指针是否为空,再释放空间然后置空,避免操控野指针。

typedef struct student
{
	char* name;
	int age;
	char* class;
}ss;
int main()
{
	ss* p = NULL;
	p = (ss*)malloc(sizeof(ss));
	p->name = (char*)malloc(sizeof(char) * 21);
	p->class = (char*)malloc(sizeof(char) * 21);
	p->age = 20;
	strcpy(p->name, "huanghaibin");
	strcpy(p->class, "zidonghau");
	printf("%d\n", p->age);
	printf("%s\n%s\n", p->name,p->class);
	if (p->class)
		free(p->class);
	p->class = NULL;
	if (p->name)
		free(p->name);
	p->name = NULL;
	if (p)
		free(p);
	p = NULL;
	return 0;
}

一系列完整的代码就是这样,因为VS编译器和老编译器的不同,一般在头文件中加一行代码,让VS编译器兼容老编译器的功能

#define _CRT_SECURE_NO_WARNINGS

打开和关闭文件

运用文件函数,我们需要先了解文件指针。

文件指针:在C语言中用一个指针指向一个变量,是系统使用typedef定义出来的有关文件的一种结构体类型,结构中含有文件名、文件状态和当前位置等信息。

文件打开形式

FILE* fp=fopen("文件位置","打开形式");

文件打开成功为文件指针,打开失败为空(NULL),因为打开失败比较常见,所以要用一个判断句来判断是否成功,如果不成功返回-1,就是关闭。而文件打开形式有好几种

文件关闭形式

文件关闭和释放堆空间一样,不能够改变文件指针,不然不能关闭,而文件关闭成功返回值类型为int,成功返回0,不成功返回-1;

fclose(fp);

示范

FILE* fp=fopen("D:/a.txt","r");
if(!fp)
{
    printf("文件打开失败");
    return -1;
}
printf("打开成功");
fclose(fp);

文件打不开的原因一般有三个:打不开文件、文件权限(读 写 执行)、程序打开文件超出上限

文件读写

(1)整个文件读写

读文件用函数fgetc()

int fgetc(FLIE* stream)
功能:从stream指定文件中读取字符
返回值
    成功:返回到读取指针
    失败:-1

写文件用函数fputc() 

int fputc(int ch,FILE* stream)
功能:将ch转换成unsigned char后写入stream对应的文件当中
返回值:
    成功:成功写入文件
    失败:返回-1
int main()
{
	FILE* fp = fopen("D:/a.txt","w");
	if (fp == NULL);
	{
		printf("文件打开失败");
		return -1; 
	}
	printf("文件打开成功");
	char name;
	while ((name = fgetc(fp) != EOF))
	{
		printf("%c", name);
	}
	char ch = "nashishabi";
	fputc(ch, fp);
	fclose(fp);
}

在这注意,文件指针不需要进行加减,文件读写的时候光标会自动到下一个。

(2)文件行读写

文件行读用函数fgets()

char* fgets(char* str,int size,FILE* stream)
功能:从strean指定的文件中读入字符,保存在str指定的内存空间中,知道出现换行符、读到文件结尾或是读了size-1个字符为止,最后会自动加上\0作为结束符结束
参数;
    str:字符串
    size:指定最大读取字符串长度(size-1)
    stream:文件指针
返回值:
    读到文件末尾或出错:NULL

文件行写函数fputs()

int fgets(const char* str,FILE* stream)
功能:将str指定的字符串写入stream指定的文件当中,字符串结束符\0不会写入文件
返回值:
    成功:0
    失败:-1

实例 

int main()
{
	FILE* fp = fopen("D:/a.txt","r");
	FILE* fp1 = fopen("d:/b.txt", "w");
	if (fp == NULL);
    {
		printf("文件打开失败");
		return -1; 
	}
	printf("文件打开成功");
	char* name = (char*)malloc(sizeof(char) * 21);
	memset(name, 0, 21);
	fgets(name, 21, fp);
	while ((name = fgetc(fp) != EOF))
	{
		printf("%c", name);
	}
	char ch[] = "nashishabi";
	fputs(ch, fp1);
	fclose(fp);
}

(3)检测文件是否到结尾的方式

#define EOF -1

 文件到结尾,返回值为-1

函数feof()

int feof(FILE* stream)
返回值
    非0值:已经到结尾
    0;未到结尾
while(!feof(fp))
{    
    printf("文件未到结尾")
}

(4)文件格式化函数

写入文件的函数fprintf()

char p[]="hello world");
fprintf(fp,"%s",p);
fprintf(fp1,"%d%d",a,b);

读取文件函数fscanf()

char p[20];
memset(p,o,20);
fscanf(fp,"%s",p);
fscanf(fp1,"%d",&a);

(5)按照块读写文件

写文件fwrite()

size_t fwrite(const void* ptr,size_t size,size_t member,FILE*stream)
功能:以数据块的方式给文件写入内容
参数:
    ptr:准备写入文件数据的地址
    size:指定写入文件的数据块大小
    member:写入文件的块数
    stream:已经打开的文件
返回值
    成功:实际成功写入文件数据的块数目
    失败:0

读文件fread()

和fwrite()相似

int main()
{
	FILE* fp = fopen("D:/b.txt", "rb");
	FILE* fp1 = fopen("d:/c.txt", "wb");
	char* p;
	p = (char*)malloc(sizeof(char) * 21);
	memset(p, 0, 21);
	fread(p, sizeof(char), 21, fp);
	fwrite(p, sizeof(char), 21, fp1);
	return 0;
}

文章转载至http://blog.bools.cn/archives/978

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值