c语言--文件操作

目录

前言

1.文件的打开和关闭

1.1文件指针

1.2文件的打开和关闭

2.文件写入和读出

2.1写入

2.2读取

 3.文件的随机读写

 3.1fseek

3.2ftell和rewind

总结


前言

        在程序设计中,文件可分为程序文件和数据文件。数据文件不一定存储的是程序,更多的是程序执行时需要读写的数据。本文讨论的就是如何使用c语言程序对数据文件进行操作。


1.文件的打开和关闭

1.1文件指针

        每一个文件的信息都存储在内存相应的文件信息区中,存储的方式是以结构体的方式并命名为FILE,一般我们会定义一个FILE类型的指针来维护文件信息区。

1.2文件的打开和关闭

        ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。fopen函数传入两个参数,分别为文件名称和文件的打开模式。关闭文件只需要传入参数,要关闭文件的指针。

//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream );

         下面可看一个例子。文件名给上"test.txt",这是一个相对路径,要操作的文件会在这个工程的文件夹目录下创建,也可以通过绝对路径来操作其他位置的文件。文件打开方式有很多种,本例中使用"w",是一种只写的方式打开。fopen函数设置完毕后返回一个FILE指针类型,我们定义一个对应类型的pf指针来接收,后续就可以通过pf指针来维护文件。

        这里面还要完善的是,判断pf是否为空指针来判断文件是否打开成功,因为如果fopen函数打开文件失败返回的是空指针。还有一点就是在关闭文件后,pf指针就没有用了,我们要把pf指向空指针,防止野指针的出现。

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

2.文件写入和读出

2.1写入

        以上完成了文件的打开和关闭,但是没有对文件内容进行任何的操作。接下来可以使用下列函数对文件内容进行写入、读取等操作。

        简单举个例子,我们用fputs函数在文件中写入hello,world!。这时我们在上述打开文件的代码中加入,文件写入代码。

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	fputs("hello world!", pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

         执行代码完毕后,我们打开工程目录下的test.txt 文件。hello world!以文本的形式写到了txt文件中。

2.2读取

        我们再试试把上面写入的内容读取,打印到控制面板。大致的程序样式与写入是差不多的。我们只需要修改打开模式和打开文件过程中的操作。

        fgets函数是将文件流上的信息读到我们准备的字符串空间中。因此在使用时,我们需要注意空间的大小是否足够读入所需的内容大小。

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	char str[15] = { 0 };
	char* f = fgets(str, 15, pf);
	printf("%s\n", f);
	fclose(pf);
	pf = NULL;
	return 0;
}

 3.文件的随机读写

 3.1fseek

        fseek函数可根据文件指针的位置和偏移量来定位文件指针。

        第一个参数时文件流,第二个就是偏移量,第三个是开始位置。文件流参数就像上面一样放入文件指针就行。偏移量可正可负,正数就是向右偏移,负数就是向左,如-1,就是向左偏移一位。开始位置有三个,分别为SEEK_CUR,SEEK_SET,SEEK_END。分别表示当前位置,起始位置和末尾。

int fseek ( FILE * stream, long int offset, int origin );

        下面写一个例子。将文件指针向右移了9位,就是最后一个字符a后的位置,于是再次调用fputs函数写入后,文件就会a字符后开始写入。

int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	fputs("I have a", pf);
	fseek(pf, 9, SEEK_SET);
	fputs("banana", pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

3.2ftell和rewind

        ftell和rewind函数能够帮助我们更好的使用fseek函数。ftell能够返回当前的偏移量,相当于告诉我们文件指针的位置。而rewind起到了一个重置的作用,将文件指针重新移动到起始位置。

long int ftell ( FILE * stream );
void rewind ( FILE * stream );

        下面我们写一个例子,打开之前写入的文件,内容如下。我们将文件指针的移动过程打印到控制台上。

        可以清楚的看到整个文件指针移动的全过程。一开始我们打印ftell返回值为0,文件指针指向文件开头。我们用fseek函数将它指向末尾左移一位,ftell返回14。又调用rewind函数后,文件指针重新回到了起始位置,ftell的返回值又变为了0。

int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	printf("%ld\n", ftell(pf));
	fseek(pf, -1, SEEK_END);
	printf("%ld\n", ftell(pf));
	rewind(pf);
	printf("%ld\n", ftell(pf));
	fclose(pf);
	pf = NULL;
	return 0;
}


总结

        以上就是文件操作中简要内容,具体还有很多文件打开模式和各类文件写入和读出的函数没有提到。后续可以将这些东西一一地尝试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值