C语言从头学49—文件操作(四)

本文继续上一篇有关 "文件操作" 内容并继续其编号。

十九、函数 ftell()

函数 ftell() 返回文件内部指针的当前位置,该函数原型定义在头文件 stdio.h中。

使用格式:ftell(参1);

参1:文件指针

返回值:返回值是一个long型的整数,表示文件开始处到当前位置的字节数;0表示文件开始位置。如果发生错误,返回-1。

说明:

a. 函数ftell与函数fseek配合使用,可以进行许多对文件内部指针的操作。比如:让fseek定位到文件结尾处,ftell可以返回整个文件的字节数。

二十、函数rewind()

函数rewind()可以让文件的内部指针回到文件开始位置,该函数原型定义在stdio.h中 。

使用格式:rewind(参1);

参1:文件指针

返回值:无

说明:rewind()功能与fseek(fp,0L,SEEK_SET)差不多,但rewind() 没有返回值;rewind()还有一个作用,会清除当前文件的错误内部指针,鉴于此,需要将内部指针重置到文件开始位置时,应优先使用rewind()函数。

二十一、函数fgetpos()与函数fsetpos()

函数fseek()和ftell()存在一个问题,就是对于文件的大小存在限制,不能超过4GB。4GB对于我们初学计算机的人员感觉已经很大,但对于专业应用场合往往会超出这个范围。为此,就有了专门处理大文件定位的函数fgetpos()和fsetpos()。这两个函数的原型也都定义在头文件stdio.h中。

使用格式:fgetpos(参1, 参2);

参1:文件指针

参2:存储内部指针位置的变量地址(参2的类型fpos_t*,fpos_t是C语言专门为文件内部指针位置设置的数据类型,本质是long long,比fseek的long大了很多)

返回值:执行成功时返回0 ,不成功返回非零值。(返回值可以用来判断函数内部指针位置是否有意义)

使用格式:fsetpos(参1, 参2);

参1:文件指针

参2:指向准备设置内部指针位置的指针(类型同上一个函数,这个指针变量不能自己随意写一个,应是通过fgetpos函数获得)

返回值:执行成功时返回0 ,不成功返回非零值。

二十二、函数ferror()与函数clearerr()

文件操作函数如果执行失败,会在文件指针里面留下记录。后面的操作只要通过文件指针读取错误记录,就知道前面的操作出错了;ferror()可以读取错误记录,clearerr()可以清除文件指针中记录的错误记录。

使用格式:ferror(参1);

参1:文件指针

返回值:如果前面的操作出现错误,ferror()返回一个非零整数(int类型),否则返回0 。

使用格式:clearerr(参1);

参1:文件指针

返回值:无

二十三、函数remove()

remove()函数用于删除文件,该函数原型定义在stdio.h中。

使用格式:remove(参1);

参1:文件名

返回值:返回值为int型,删除成功返回0 ,失败返回非零值。

说明:

a.文件名可以用字符串变量传入,也可以直接写成字符串常量;

b.文件如果不是在当前目录下,文件名应包含路径;

c.要删除的文件必须是关闭状态的。

二十四、函数rename()

rename()函数用于更改文件名称,该函数原型定义在头文件stdio.h。

使用格式:rename(参1,参2);

参1:文件原名字

参2:文件新名字

返回值:返回值为int类型,改名成功返回0,失败返回非0值。

说明:

a.文件名的要求同上一个函数;新旧文件名不能相同。

b.当把文件新名字中的路径写成与原名字路径不同时,相当于把文件进行了移动。(由于路径不同,文件名相同也无所谓)

二十五、上述函数应用举例程序如下:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int main(void)
{
	FILE* fp=fopen("temp.txt","wb+"); //以二进制写读方式创建temp.txt
	int arr[100];
	for (int i = 0; i < 100; i++)
	{
		arr[i] = i + 1;
	}
	fwrite(arr, sizeof(int), 100, fp); //将整数1---100写入文件
//实验rewind函数
	rewind(fp); //该函数将内部指针指向文件开始
    int num;
	fread(&num, sizeof(num), 1, fp); //读取一个整型数
    printf("第1次读取到 %d\n", num); //运行结果:第1次读取到 1
	   //第一次读取到的是1,说明rewind已将内部指针置于了文件开始处
//实验ftell函数
	fread(&num, sizeof(int), 1, fp);
	printf("第2次读取到 %d\n", num); //运行结果:第2次读取到 2
	long ps = ftell(fp);
	printf("sizeof(int)=%d\n", (int)sizeof(int));//运行结果:sizeof(int)=4
	printf("当前内部指针位于:%d\n", ps); //运行结果:当前内部指针位于:8
	  //分析:由于每个int占4个字节,故字节0、1、2、3存储"1";字节4、5、6、7存储"2";2已读出,
	  //所以指针指着下个数由字节8、9、10、11存储的"3"。
//实验fgetpos函数和fsetpos函数
	fpos_t pos;
	if(0!=fgetpos(fp, &pos)) return 0; //获取当前内部指针位置赋给pos
	printf("使用fgetpos获取当前内部指针:%d\n", (int)pos);//运行结果:使用fgetpos获取当前内部指针:8
	int num1[50];
    fpos_t pos1;
	fread(num1, sizeof(int), 50, fp);
	if(0!=fgetpos(fp, &pos1)) return 0; //获取当前内部指针位置赋给pos1
	printf("读取50个元素后当前内部指针:%d\n", (int)pos1);//运行结果:读取50个元素后当前内部指针:208
	if (0 != fsetpos(fp, &pos)) return 0; //将当前内部指针恢复到pos位置
	if (0 != fgetpos(fp, &pos1)) return 0;//重新获取内部指针赋值给pos1
	printf("恢复指针后当前内部指针:%d\n", (int)pos1);//运行结果:恢复指针后当前内部指针:8
	fclose(fp);
//实验函数ferror()与函数clearerr()
	if (NULL == freopen("temp.txt", "rb", fp))return 0;
	  //以二进制读方式重新打开temp.txt,文件指针复用fp
	int a = 1000;
	fwrite(&a, sizeof(int), 1, fp);
	  //我们将数据a试图写入以读方式打开的文件(应当出错)
	int ret = ferror(fp);//用ferror函数检查上一步读写函数是否出错
	printf("错误代码:%d\n", ret);//运行结果:错误代码:1(0正常,非0出错)
	clearerr(fp);//清除文件指针fp中的错误信息
    ret = ferror(fp);
    printf("再次查询错误代码:%d\n", ret);//运行结果:0(0正常,错误信息已清除)
	fclose(fp);
//实验rename函数
	char oldName[] = "temp.txt";
	char newName[] = "C:\\Users\\Administrator\\Desktop\\temp.txt";
	        // "\\"头一个斜杠称为转义符
	ret = rename(oldName, newName);
	if (ret == 0)
	{
		printf("文件更名成功!\n");//运行结果:temp.txt被移到了桌面
	}
	else
	{
		printf("文件更名失败...\n");
	}
//实验remove函数
	char filename[] = "temp.txt";
	ret = remove(filename);
	if (ret == 0)
	{
		printf("文件删除成功...");
	}
	else
	{
		printf("文件删除失败...");//运行结果:删除失败(因为temp.txt被移到了桌面)
	}
	getchar();
	return 0;
}
相关推荐
XH华2 小时前
初识C语言之二维数组(下)
c语言·算法
Uu_05kkq6 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法
嵌入式科普8 小时前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
A懿轩A8 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
1 9 J9 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法
仍然探索未知中10 小时前
C语言经典100例
c语言
爱吃西瓜的小菜鸡11 小时前
【C语言】矩阵乘法
c语言·学习·算法
Stark、12 小时前
【Linux】文件IO--fcntl/lseek/阻塞与非阻塞/文件偏移
linux·运维·服务器·c语言·后端
deja vu水中芭蕾13 小时前
嵌入式C面试
c语言·开发语言
stm 学习ing14 小时前
HDLBits训练3
c语言·经验分享·笔记·算法·fpga·eda·verilog hdl