文件操作函数

前言:在C语言中我们创捷数据都是在内存上面,一旦程序结束数据就会流失。为了把我们想要保存的数据保存下来,我们可以考虑把数据储存在磁盘中,也就是存在硬盘里,因此,接下来介绍文件操作函数来实现储存数据在磁盘上面。

1.打开文件

首先我们得学会打开文件和创造一个文件,这里用到的是fopen函数

FILE *fopen(const char *filename, const char *mode)

filename是文件名称,mode是打开方式,以下是打开方式的列表

 没错,如果文件并不存在,一些打开方式会自动帮你创建文件。

FILE* p = fopen("test3_29.txt", "rb");
	if (p == NULL)
	{
		perror("fopen");
		return 1;

需要注意的是,如果fopen函数打开文件出错会返回NULL,因此需要做一个判断,如果返回出错,则会打印出错原因以及提前结束程序。

2.输入数据

功能函数适用于
字符输入函数fgetc

所有输入流

字符输出函数fputc所有输出流
文本行输入函数fgets所有输入流
文本行输出函数fputs所有输出流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输出流
二进制输入fread文件
二进制输入fwirite文件

以fputs函数为例

int fputs(const char *str, FILE *stream)
int main()
{
	FILE* pf = fopen("test4_1.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("如果真爱有颜色,那一定是蓝色",pf);
	fclose(pf);
	pf = NULL; 
	return 0;
}

然后打开文件即可看到输入的内容

但是值得注意的是,如果使用改程序再次输入新的内容会覆盖原来的文本

int main()
{
	FILE* pf = fopen("test4_1.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("如果真爱有颜色,那一定是绿色",pf);
	fclose(pf);
	pf = NULL; 
	return 0;
}

 

 因此,如果是想要往文本里面追加内容,需要使用其他的打开方式。例如"a"

int main()
{
	FILE* pf = fopen("test4_1.txt", "a");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("我永远喜欢蕾姆",pf);
	fclose(pf);
	pf = NULL; 
	return 0;
}

 

如果想要实现换行输入的话只需输入\n即可

int main()
{
	FILE* pf = fopen("test4_1.txt", "a");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	fputs("\n大家都喜欢蕾姆",pf);
	fclose(pf);
	pf = NULL; 
	return 0;
}

 3.读取数据

char *fgets(char *str, int n, FILE *stream)

 str表示内容读取成功后所要放到的空间,n表示读取的字节数字,stream就是流(下面的例子中是文件)

int main()
{
	FILE* pf = fopen("test4_1.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	char arr[100] = { 0 };
	fgets(arr,100,pf);
	printf("%s", arr);
	fclose(pf);
	pf = NULL; 
	return 0;
}

 但是该种方法只能读取一行数据,要想读取整个文件的数据要用fread函数

4.关闭文件

当我们写入和读取结束后就要关闭文件

flclose(pf);
pf=NULL;

 同时注意要把文件FILE类型的指针置空,以防其成为野指针。

5.文件位置指针函数

ftell函数

long int ftell(FILE *stream)

该函数返回的是一个文件位置指针的long int类型的数字

int main()
{
	FILE* pf = fopen("test4_2.txt", "w");
	printf("%d", ftell(pf));
	return 0;
}

 这里我们只是打开了一个文件,并没有输入任何数据,也就是说文件中为空的文本,此时返回值为0(你可以按数组的方法来理解,认为0代表第一个字节,或者认为0代表相对于首个字节的偏移量)

int main()
{
	FILE* pf = fopen("test4_2.txt", "w");
	fprintf(pf, "helloworld");
	printf("%d", ftell(pf));
	return 0;
}

这里的文件位置指针是指向末尾字母后面的一个字节的位置--10(如果指向d话就为9,指向d后面一个字节位置就是10 )

既然我们能够获取文件位置指针的大小,我们也可以修改部分文字

fseek函数

int fseek(FILE *stream, long int offset, int whence)

该函数的作用就是调整文件位置指针。

whence表示你要开始的位置,offset表示相对于whence的偏移量(+表示从whence开始想左,-表示从whence开始向右)

int main()
{
	FILE* pf = fopen("test4_2.txt", "r+");
	fseek(pf,-5, SEEK_END);
	fprintf(pf, "happy");
	/*printf("%d", ftell(pf));*/
	return 0;
}

fseek(pf,-5,SEEK_END)是从该数据最后一个数字后面的那个 字节的位置向前偏移5个位置。

这里成功地将world修改为happy。 

rewind函数

void rewind(FILE *stream)

将文件位置指针置为0,即指向第一个字节

这里我们就不举例了

接下来实现读取文件全文内容

先往一个文件里输入两行数据

int main()
{
	FILE* pf = fopen("test4_3.txt", "w");
	char arr[100] = { 0 };
	/*fseek(pf, 0, SEEK_END);*/
	fwrite("helloworld\nhelloworld",1,20,pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

这里因为\n占了一个字节的位置,所以最后的d没有输入上去!

int main()
{
	FILE* pf = fopen("test4_3.txt", "r");
	char arr[100] = { 0 };
    fseek(pf, 0, SEEK_END);
	int count = ftell(pf);
	rewind(pf);
	fread(arr,1,count,pf);
	printf("%s", arr);
	fclose(pf);
	pf = NULL;
	return 0;
}

 

 当然如果你想手工计算然后读取的话除了把总字节数加起来,还要加上第一行的\n因此读取的字节数应该是10+1+9=20.

int main()
{
	FILE* pf = fopen("test4_3.txt", "r");
	char arr[100] = { 0 };
    fseek(pf, 0, SEEK_END);
	int count = ftell(pf);
	rewind(pf);
	fread(arr,1,20,pf);
	printf("%s", arr);
	fclose(pf);
	pf = NULL;
	return 0;
}

以上就是全部内容了,如有错误还望各位指正!! 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值