zl程序教程

您现在的位置是:首页 >  其它

当前栏目

ftell函数

函数
2023-09-14 09:13:37 时间

在这里插入图片描述

利用返回值可以统计文件中的字节大小,不算\0

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void test01()
{
	FILE* fp = fopen("hello.txt", "r");
	//移动光标到文件结尾
	fseek(fp, 0, SEEK_END);
	//long长整型-----输出格式-----ld
	long num = ftell(fp);
	printf("文件中的字节大小=%ld\n", num);
	//将文件中的数据读取出来,放入一个堆区数组中
	char* p = (char*)malloc(num + 1);//加一存放\0
	//清空内存
	memset(p, 0, num + 1);
	//按块读取
	//参数1:数据首地址 参数2:   对结构体:块大小(普通数组:每次读取数据大小) 参数3:块个数(读取几次) 参数4:文件指针
	//将文件指针移至文件开头
	rewind(fp);
	fread(p, num, 1, fp);
	printf("%s", p);
	//堆区内存手动开辟手动释放
	if (p != NULL)
	{
		free(p);
		p = NULL;
	}
	//关闭文件
	fclose(fp);
}
int main()
{
	test01();
	return 0;
}

在这里插入图片描述
注意:当用fwrite读取文件中的字符串内容时,要用memset内存设置函数清空在堆区开辟的内存,否则会出现乱码
上面的问题只针对在堆区动态开辟的内存,因为堆区开辟的内存系统会随机赋值
在这里插入图片描述
一般按块读取用于结构体,子符串读取用fgets函数读取一行就不会出错,也不用加memset
但是fgets函数遇到\0结束读取,但是放入字符串中时会保留一个字节放\0
因此hello world的字节数是num,用fgets的时候,在最大字节数那里至少填num+1

fread函数不会向子符串结添加\0

下面验证:
在这里插入图片描述
在这里插入图片描述

当堆区动态开辟是时,用fgets就不用memset函数

在这里插入图片描述
总结:读取结构体建议用fwrite,读取字符串建议用fgets